1

存在包含可选(“应该”子句)强制和禁止标记的查询。以下两个查询返回不同的结果。但应该是一样的,不是吗?

+_query_:"{!type=**dismax** mm='2<2 3<3 5<4 7<51%' qf='normalizedField'} opt1 opt2 +mandatory -prohibited"

VS

+_query_:"{!type=**edismax** mm='2<2 3<3 5<4 7<51%' qf='normalizedField'} opt1 opt2 +mandatory -prohibited"

使用最小“应该”匹配参数:

毫米:“2<2 3<3 5<4 7<51%”

有任何想法吗?谢谢

更新 了 solr 索引中有文档:

{
   ...
   "normalizedField":"opt1 opt3 mandatory"
   ...
}

使用dismax查询进行搜索:

+_query_:"{!type=dismax mm='2<2 3<3 5<4 7<51%' qf='normalizedField'} opt1 opt2 +mandatory -prohibited"

"parsedquery_toString":"+(((normalizedField:opt1) (normalizedField:opt2) +(normalizedField:mandatory) -(normalizedField:prohibited))~2) ()"

返回空结果(如预期)

使用edismax查询进行搜索:

+_query_:"{!type=edismax mm='2<2 3<3 5<4 7<51%' qf='normalizedField'} opt1 opt2 +mandatory -prohibited"

"parsedquery_toString": "+((normalizedField:opt1) (normalizedField:opt2) +(normalizedField:mandatory) -(normalizedField:prohibited))"

退回此文件。为什么?

4

2 回答 2

2

似乎我找到了解决方案。我使用了已知问题的 5.2 solr 版本(https://issues.apache.org/jira/browse/SOLR-2649)。升级到版本 5.5.1 后问题得到解决)并且 edismax 的工作方式与 dismax 相同(对于我的示例)

于 2016-06-09T16:08:27.587 回答
0

edismax 和 dismax 不相同(在这种情况下没有任何理由引入 edismax)。edismax通过引入几个新特性扩展了 dismax 的语法集和魔力:

  • 支持完整的 Lucene 查询解析器语法。
  • 支持 AND、OR、NOT、- 和 + 等查询。
  • 在 Lucene 语法模式中将“and”和“or”视为“AND”和“OR”。
  • 尊重“魔法场”名称 _val_ 和 _query_。这些不是 Schema 中的真实字段,但如果使用它有助于做一些特殊的事情(比如 _val_ 的函数查询或 _query_ 的嵌套查询)。如果 _val_ 用于术语或短语查询,则该值被解析为函数。
  • 包括在语法错误的情况下改进的智能部分转义;此模式仍支持字段查询、+/- 和短语查询。
  • 通过使用单词 shingles 来提高邻近度;在应用邻近提升之前,您不需要查询来匹配文档中的所有单词。
  • 包括高级停用词处理:查询的强制部分不需要停用词,但仍用于邻近提升部分。如果查询包含所有停用词,例如“to be or not to be”,那么所有单词都是必需的。
  • 包括改进的升压功能:在扩展 DisMax 中,升压功能是乘数而不是加数,提高了升压结果;还支持 DisMax(bf 和 bq)的加法增强功能。
  • 支持纯负嵌套查询:+foo (-foo) 等查询将匹配所有文档。
  • 允许您指定允许最终用户查询哪些字段,并禁止直接字段搜索。

我用粗体显示了容易影响评分的那些,而诸如“纯否定嵌套查询”之类的功能将改变包含哪些文档。由于支持完整的 lucene 查询解析器语法,因此也会发生同样的情况。

实际找出正在发生的事情的最简单方法是使用debugQuerySolr 的功能,这样您就可以看到分数以及 dismax 和 edismax 查询扩展的确切内容。

..如果 dismax 有效,您可以使用它。

于 2016-06-09T11:05:06.060 回答