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

时间:2016-06-09 09:41:53

标签: solr edismax dismax

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

+_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"

使用最小值#34;应该&#34;匹配参数:

  

mm:&#34; 2&lt; 2 3&lt; 3 5&lt; 4 7&lt; 51%&#34;

有什么想法吗?感谢

更新 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))"

返回此文件。为什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

edismax和dismax不相同(在这种情况下引入edismax不会有任何理由)。 edismax扩展了dismax的语法集和魔力,by introducing several new features

  • 支持完整的Lucene查询解析器语法。
  • 支持AND,OR,NOT, - 和+。
  • 等查询
  • 对待&#34;和&#34;和&#34;或&#34; as&#34; AND&#34;和&#34;或&#34;在Lucene语法模式中。
  • 尊重魔法领域&#39; name _val_和_query_。这些不是Schema中的真实字段,但如果使用它有助于做特殊事情(例如_val_的情况下的函数查询或_query_的情况下的嵌套查询)。如果在术语或短语查询中使用_val_,则将该值解析为函数。
  • 包括在语法错误的情况下改进的智能部分转义;此模式仍支持现场查询,+ / - 和短语查询。
  • 通过使用单词瓦片改善接近性提升;在应用接近性提升之前,您不需要查询来匹配文档中的所有单词。
  • 包含高级停用词处理:查询的强制部分不需要停用词,但仍在邻近提升部分中使用。如果查询包含所有停用词,例如&#34;是否为&#34;,那么所有单词都是必需的。
  • 包括改进的提升功能:在Extended DisMax中,提升功能是一个乘数而不是加数,可以提高你的提升效果;还支持DisMax(bf和bq)的附加增强功能。
  • 支持纯负面嵌套查询:+ foo(-foo)等查询将匹配所有文档。
  • 允许您指定允许最终用户查询的字段,以及禁止直接进行现场搜索。

我对那些容易影响评分的内容进行了粗体扩展,同时还提供了诸如&#34;纯负面嵌套查询等功能。将更改包含哪些文件。由于支持完整的lucene查询解析器语法,因此可能会发生同样的情况。

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

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