我遇到了弹性结果排序与布尔型查询(一种通配符(相结合的严重问题。
比方说我们有一篇博客文章;内容";。每个帖子都包含一些关于龙的信息。所有这些单词的组合";龙人。。德拉戈。迷你龙&";。大量文本。
并且我们需要通过字符串"*rago*"
来搜索它。
理想情况下,这意味着我们需要匹配所有文档,这些文档包含*rago*
的所有组合
im在之前使用simple_query
"query_string":{"default_field":"内容";,"查询":"*rago*"
}
我对结果很满意。但是排序。。。没有考虑出现的次数。排序忽略了"*rago*"
在每个文档的内容字段中出现的次数。
如何解决?
我花了几天时间在谷歌上搜索。。。术语向量。。字段数据。脚本等,但无论如何,似乎没有任何问题。例如,排序适用于匹配查询,但随后我需要搜索";龙;不适用于"*rago*"
但是对于建议搜索,我们使用>我们需要能够通过输入字符串的任何部分进行搜索。
非常感谢您的帮助。
默认情况下,通配符查询被重写为constant_score
查询
这意味着为排名计算的匹配分数弹性搜索将忽略term frequency
(查询项在搜索字段中的出现次数(。
此外,elasticsearch并不匹配"*rago*"
,而是匹配通配符表达式的唯一索引术语列表(在您的案例中,在所有博客文章中(:
Pseudocode: MATCH ANY_OF("dragon", "dragonians", "minidragon", "drago", ...)
如果您想要一篇使用"dragon"
两次的博客文章超过使用"minidragon"
一次的博客帖子(对于查询"*rago*"
(,那么将参数"rewrite": "scoring_boolean"
添加到您的查询中。
请参阅此处的注意事项和其他重写选项:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-term-rewrite.html