Solr Dismax和Edismax请求为同一查询提供不同的结果



有一个查询包含可选("should"子句)、强制和禁止的令牌。以下两个查询返回不同的结果。但应该是一样的,不是吗?

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

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

最小"应该"匹配参数:

mm:"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))"

退回此文档。为什么?

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

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

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

我已经将那些容易影响评分的文档加粗,而"纯负面嵌套查询"等功能将更改包含的文档。由于支持完整的lucene查询解析器语法,也会出现同样的情况。

真正了解发生了什么的最简单方法是使用Solr的debugQuery功能,这样你就可以看到分数以及dismax和edismax查询的确切扩展。

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

最新更新