Solr Dismax 和 Edismax 请求为同一查询提供不同的结果
Solr Dismax and Edismax request gives different results for the same query
存在包含可选("should" 子句)强制和禁止标记的查询。以下两个查询 returns 不同的结果。不过应该一样吧?
+_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"
最小值"Should"匹配参数:
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) ()"
return 空结果(符合预期)
但是
正在使用 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))"
return 这份文件。为什么?
edismax 和 dismax 并不相同(在这种情况下没有任何理由引入 edismax)。 edismax 扩展了 dismax 的语法集和魔力,by introducing several new features:
- 支持完整的 Lucene 查询解析器语法。
- 支持 AND、OR、NOT、- 和 + 等查询。
- 在 Lucene 语法模式中将 "and" 和 "or" 视为 "AND" 和 "OR"。
- 尊重 'magic field' 名称 _val_ 和 _query_。这些不是模式中的真实字段,但如果使用它有助于做特殊的事情(如 _val_ 情况下的函数查询或 _query_ 情况下的嵌套查询)。如果在术语或短语查询中使用 _val_,则该值将被解析为函数。
- 包括在语法错误的情况下改进的智能部分转义;此模式仍支持字段查询、+/- 和短语查询。
- 通过使用 word shingles 改进邻近度提升;在应用邻近度提升之前,您不需要查询来匹配文档中的所有单词。
- 包括高级停用词处理:查询的强制性部分不需要停用词,但仍用于邻近度提升部分。如果查询由所有停用词组成,例如 "to be or not to be",则所有词都是必需的。
- 包括改进的提升功能:在Extended DisMax中,提升功能是一个乘数而不是加数,提高你的提升效果;还支持 DisMax(bf 和 bq)的附加增强函数。
- 支持纯否定嵌套查询:+foo (-foo) 等查询将匹配所有文档。
- 允许您指定允许最终用户查询哪些字段,并禁止直接字段搜索。
我将那些很容易影响评分的内容加粗了,而 "pure negative nested queries" 等功能会改变包含的文档。由于支持完整的 lucene 查询解析器语法,也会发生同样的情况。
真正了解发生了什么的最简单方法是使用 Solr 的 debugQuery
功能,这样您就可以看到分数以及 dismax 和 edismax 查询扩展到的确切内容。
.. 如果 dismax 有效,你就可以使用它。
我似乎找到了解决方案。我使用的 5.2 solr 版本有已知问题(https://issues.apache.org/jira/browse/SOLR-2649)。升级到 5.5.1 版本后问题得到解决)并且 edismax 与 dismax 的工作方式相同(对于我的示例)
存在包含可选("should" 子句)强制和禁止标记的查询。以下两个查询 returns 不同的结果。不过应该一样吧?
+_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"
最小值"Should"匹配参数:
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) ()"
return 空结果(符合预期)
但是
正在使用 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))"
return 这份文件。为什么?
edismax 和 dismax 并不相同(在这种情况下没有任何理由引入 edismax)。 edismax 扩展了 dismax 的语法集和魔力,by introducing several new features:
- 支持完整的 Lucene 查询解析器语法。
- 支持 AND、OR、NOT、- 和 + 等查询。
- 在 Lucene 语法模式中将 "and" 和 "or" 视为 "AND" 和 "OR"。
- 尊重 'magic field' 名称 _val_ 和 _query_。这些不是模式中的真实字段,但如果使用它有助于做特殊的事情(如 _val_ 情况下的函数查询或 _query_ 情况下的嵌套查询)。如果在术语或短语查询中使用 _val_,则该值将被解析为函数。
- 包括在语法错误的情况下改进的智能部分转义;此模式仍支持字段查询、+/- 和短语查询。
- 通过使用 word shingles 改进邻近度提升;在应用邻近度提升之前,您不需要查询来匹配文档中的所有单词。
- 包括高级停用词处理:查询的强制性部分不需要停用词,但仍用于邻近度提升部分。如果查询由所有停用词组成,例如 "to be or not to be",则所有词都是必需的。
- 包括改进的提升功能:在Extended DisMax中,提升功能是一个乘数而不是加数,提高你的提升效果;还支持 DisMax(bf 和 bq)的附加增强函数。
- 支持纯否定嵌套查询:+foo (-foo) 等查询将匹配所有文档。
- 允许您指定允许最终用户查询哪些字段,并禁止直接字段搜索。
我将那些很容易影响评分的内容加粗了,而 "pure negative nested queries" 等功能会改变包含的文档。由于支持完整的 lucene 查询解析器语法,也会发生同样的情况。
真正了解发生了什么的最简单方法是使用 Solr 的 debugQuery
功能,这样您就可以看到分数以及 dismax 和 edismax 查询扩展到的确切内容。
.. 如果 dismax 有效,你就可以使用它。
我似乎找到了解决方案。我使用的 5.2 solr 版本有已知问题(https://issues.apache.org/jira/browse/SOLR-2649)。升级到 5.5.1 版本后问题得到解决)并且 edismax 与 dismax 的工作方式相同(对于我的示例)