本地参数在 solr 8 中不起作用,但在 solr 5 中起作用
local param not working in solr 8 but working in solr 5
我正在从 solr 5.5 迁移到 solr 8。
查询 solr 5.5 看起来像 -
qt=/dismax
product_fields_Ref1=product_concept^279841
sku_and_product_fields_Ref1=silhouette_concept^234256 $product_fields_Ref1
product_phrase_Ref2=pant
concept_with_synonyms_ref1=({!edismax2 qf=$sku_and_product_fields_Ref1 v=$product_phrase_Ref2})
top_concept_query_ref= (+({!maxscore v=$concept_with_synonyms_ref1}) )
productQueryRef3=+(+({!query v=$cq})) +( ({!maxscore v=$top_concept_query_ref}) )
sq=+{!lucene v=$productQueryRef3}
q={!parent tag=top which=$pq score=max v=$sq}
但是在 solr 8.0 上给出了错误 -
Error from server at http://localhost:8080/products: org.apache.solr.search.SyntaxError: Query Field '$product_fields_Ref1' is not a valid field name
如果我这样修改查询(删除变量 product_fields_Ref1 并将值直接附加到 sku_and_product_fields_Ref1)-
qt=/dismax
sku_and_product_fields_Ref1=silhouette_concept^234256 product_concept^279841
product_phrase_Ref2=pant
concept_with_synonyms_ref1=({!edismax2 qf=$sku_and_product_fields_Ref1 v=$product_phrase_Ref2})
top_concept_query_ref= (+({!maxscore v=$concept_with_synonyms_ref1}) )
productQueryRef3=+(+({!query v=$cq})) +( ({!maxscore v=$top_concept_query_ref}) )
sq=+{!lucene v=$productQueryRef3}
q={!parent tag=top which=$pq score=max v=$sq}
问题是我无法修改此查询,因为参数 "product_fields_Ref1" 的值是从大量地方编译而来的。
我只使用 defType=dismax。
任何人都可以指导需要解决的问题吗?
在较新版本的 Solr 中,对局部参数的支持发生了显着变化(请参阅 https://lucene.apache.org/solr/guide/7_5/solr-upgrade-notes.html#solr-7-2)
我能够恢复某些行为的唯一方法是将 lucene
设置为 solrconfig.xml
中的默认解析器,然后在查询中传递本地参数,例如: q={!dismax qf=$param1}coffee
我知道您可以通过切换到 LuceneMatchVersion 7.1.0 恢复旧行为,但该更改对我不起作用。
我查看了 "org.apache.solr.search.ExtendedDismaxQParser" 的源代码
并发现添加了一个新的验证检查,它不允许在 qf 字段 edismax 解析器中使用局部参数(此检查已从 solr 8.0.0 开始引入)。
检查是这样的 -
qf 中的任何参数必须与核心模式(我没有使用无模式模式)中的字段匹配。方法是
validateQueryFields(up);
这在
中执行
public Query parse() throws SyntaxError { ... }
共
org.apache.solr.search.ExtendedDismaxQParser
我通过创建自己的自定义解析器实现了此功能,并在覆盖 parse() 方法后删除了此验证器。
我正在从 solr 5.5 迁移到 solr 8。 查询 solr 5.5 看起来像 -
qt=/dismax
product_fields_Ref1=product_concept^279841
sku_and_product_fields_Ref1=silhouette_concept^234256 $product_fields_Ref1
product_phrase_Ref2=pant
concept_with_synonyms_ref1=({!edismax2 qf=$sku_and_product_fields_Ref1 v=$product_phrase_Ref2})
top_concept_query_ref= (+({!maxscore v=$concept_with_synonyms_ref1}) )
productQueryRef3=+(+({!query v=$cq})) +( ({!maxscore v=$top_concept_query_ref}) )
sq=+{!lucene v=$productQueryRef3}
q={!parent tag=top which=$pq score=max v=$sq}
但是在 solr 8.0 上给出了错误 -
Error from server at http://localhost:8080/products: org.apache.solr.search.SyntaxError: Query Field '$product_fields_Ref1' is not a valid field name
如果我这样修改查询(删除变量 product_fields_Ref1 并将值直接附加到 sku_and_product_fields_Ref1)-
qt=/dismax
sku_and_product_fields_Ref1=silhouette_concept^234256 product_concept^279841
product_phrase_Ref2=pant
concept_with_synonyms_ref1=({!edismax2 qf=$sku_and_product_fields_Ref1 v=$product_phrase_Ref2})
top_concept_query_ref= (+({!maxscore v=$concept_with_synonyms_ref1}) )
productQueryRef3=+(+({!query v=$cq})) +( ({!maxscore v=$top_concept_query_ref}) )
sq=+{!lucene v=$productQueryRef3}
q={!parent tag=top which=$pq score=max v=$sq}
问题是我无法修改此查询,因为参数 "product_fields_Ref1" 的值是从大量地方编译而来的。 我只使用 defType=dismax。 任何人都可以指导需要解决的问题吗?
在较新版本的 Solr 中,对局部参数的支持发生了显着变化(请参阅 https://lucene.apache.org/solr/guide/7_5/solr-upgrade-notes.html#solr-7-2)
我能够恢复某些行为的唯一方法是将 lucene
设置为 solrconfig.xml
中的默认解析器,然后在查询中传递本地参数,例如: q={!dismax qf=$param1}coffee
我知道您可以通过切换到 LuceneMatchVersion 7.1.0 恢复旧行为,但该更改对我不起作用。
我查看了 "org.apache.solr.search.ExtendedDismaxQParser" 的源代码 并发现添加了一个新的验证检查,它不允许在 qf 字段 edismax 解析器中使用局部参数(此检查已从 solr 8.0.0 开始引入)。
检查是这样的 -
qf 中的任何参数必须与核心模式(我没有使用无模式模式)中的字段匹配。方法是
validateQueryFields(up);
这在
中执行public Query parse() throws SyntaxError { ... }
共
org.apache.solr.search.ExtendedDismaxQParser
我通过创建自己的自定义解析器实现了此功能,并在覆盖 parse() 方法后删除了此验证器。