【发布时间】:2018-06-05 06:53:02
【问题描述】:
使用“或”运算符时,是否可以根据匹配数对我的搜索进行评分?
目前查询如下:
"query": {
"function_score": {
"query": {
"match": {
"tags.eng": {
"query": "apples banana juice",
"operator": "or",
"fuzziness": "AUTO"
}
}
},
"script_score": {
"script": # TODO
},
"boost_mode": "replace"
}
}
我不想使用“and”运算符,因为我希望找到包含“apple juice”的文档,以及仅包含“juice”的文档等。但是包含三个单词的文档应该得分更高比包含两个词或单个词的文档,等等。
我在这里找到了一个可能的解决方案https://github.com/elastic/elasticsearch/issues/13806 它使用布尔查询。但是我不知道如何访问分析器生成的令牌(在本例中:苹果、香蕉、果汁)。
有什么帮助吗?
【问题讨论】:
-
我认为您要做的是创建自己的搜索算法。一般来说,您的前提应该有效。但是,如果文档中有 5 次苹果,或者只有一个文档中有苹果,那肯定比所有其他有香蕉的文档更相关的答案吗?或者......你明白我的意思了 :) BM25 是现在计算这种相关性的方式。您可以查看elastic.co/guide/en/elasticsearch/reference/current/… 以微调此过程或提出您自己的过程。
-
感谢您的评论。我之前没有提到,但我不是在搜索文本。我正在搜索以前标记的文档,频率并不重要。我试图用另一个例子来澄清。假设我正在搜索“blue sky”,并且有 4 个文档标记为:[sky, moon], [blue car, blue jeans, city], [blue sea, sky, surf], [blue sky, village]。我希望第 3 次比第 1 次和第 2 次更相关,但比第 4 次要少。我目前有一个使用“and”的布尔查询,另一个使用“or”,所以我可以区分第 4 种情况,但我无法区分第 3 种和第 1 种和第 2 种。
-
如果你还没有读过这篇文章,我想给你指出:elastic.co/guide/en/elasticsearch/guide/current/…
-
你从语义的角度来看这个,但 ES 只看到位和字节。
blue sea和blue可能看起来与您和我相似,但对于 ES,它完全不同。如果您希望带有blue sky标记的文档也出现在搜索blue中,您应该添加“蓝色”标签。 -
谢谢@archit。我已经更新了您指向的链接,它实际上看起来很有帮助。但是,在该示例中,每个搜索词(“wifi”、“garden”、“pool”)都需要一个查询。在我的特殊情况下,我想搜索包含多个单词的术语,例如“blue sky”,并匹配整个术语以及单个单词,即由分析器生成的标记“blue”和“sky” .我的问题是:可以在查询中访问这些令牌吗?否则,你有什么建议?
标签: elasticsearch