首页 > 解决方案 > 将 ElasticSearch 相关性分数配置为优先匹配所有单词而不是匹配某些单词?

问题描述

例如,在搜索“堆栈溢出”时,我希望包含“堆栈”和“溢出”的文档比仅包含其中一个单词的文档具有更高的分数。

现在,我看到包含 0 次“堆栈”和 50 次“溢出”的文档排名高于包含 1 次“堆栈”和 1 次“溢出”的文档。

第二个问题是将具有确切单词而不是单词变体的文档排名更高。例如,包含“stack”的文档的排名应该高于包含“stacking”的文档。

第三个问题是将具有相邻单词的文档排名更高。例如,文档“如何使用堆栈溢出”的排名应高于文档“文件堆栈导致收件箱溢出”。

如果将这三个问题放在一起,以下是“堆栈溢出”所需结果排名的示例:

示例搜索结果

是否可以配置索引或查询以这种方式计算分数?

标签: elasticsearch

解决方案


在这里,您试图在一个查询中实现多项目标。首先,您应该尝试了解 ES 如何返回结果。

  1. 包含溢出50 次的文档排名高于包含“堆栈”1 次和“溢出”1 次的文档,因为 ES 分数计算是基于tf/idf的分数计算。显然,在这种情况下,溢出来了 50 次,这比另一个文档中其他 2 个术语的其他频率组合要高得多。

注意:- 您可以按照链接中的说明禁用此计算。

如果您不关心某个术语在字段中出现的频率,而您只关心该术语是否存在,那么您可以在字段映射中禁用术语频率:

  1. stacking由于词干提取,您将获得包含该术语的结果,并且如果您不希望包含stacking不应该出现在搜索结果中的文档,则不要以词干形式记录文档或在从 ES 获取结果后进行一些后处理并减少他们的分数,不确定 ES 是否开箱即用。

  2. 您想要的第三件事是词组搜索

也可以使用explain api来理解,ES是如何根据你的查询计算文档的分数的,它将帮助你根据你的要求构造正确的查询。


推荐阅读