【问题标题】:local param not working in solr 8 but working in solr 5本地参数不在 solr 8 中工作,但在 solr 5 中工作
【发布时间】:2020-03-07 19:42:27
【问题描述】:

我正在从 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 上出现错误 -

来自服务器 http://localhost:8080/products 的错误:org.apache.solr.search.SyntaxError:查询字段“$product_fields_Ref1”不是有效的字段名称

如果我像这样修改查询(删除变量 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 lucene solr5 solr8


    【解决方案1】:

    我浏览了“org.apache.solr.search.ExtendedDismaxQParser”的源代码 并发现添加了一个新的验证检查,它不允许在 qf 字段 edismax 解析器中使用本地参数(此检查已从 solr 8.0.0 开始引入)。

    检查是这样的 -

    qf 中的任何参数都必须匹配核心模式中的字段(我没有使用无模式模式)。方法是

    validateQueryFields(up);

    这在

    中执行

    public Query parse() 抛出 SyntaxError { ... }

    org.apache.solr.search.ExtendedDismaxQParser

    我通过创建自己的自定义解析器来实现此功能,并在覆盖 parse() 方法后删除了此验证器。

    【讨论】:

      【解决方案2】:

      在最近的 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 来恢复旧行为,但该更改对我不起作用。

      【讨论】:

      • 感谢@hector 抽出宝贵时间调查此事。我得到了主要问题,为什么它只发生在 solr 8.0.0 而不是早期版本。我已将我的发现放入答案中。
      猜你喜欢
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多