ElasticSearch:给定一个文档和一个查询,相关性得分是多少?
Posted
技术标签:
【中文标题】ElasticSearch:给定一个文档和一个查询,相关性得分是多少?【英文标题】:ElasticSearch: given a document and a query, what is the relevance score? 【发布时间】:2020-08-02 14:29:48 【问题描述】:一旦在 ElasticSearch 上执行查询,就会为每个检索到的文档计算相关性 _score
。
给定一个特定的文档(例如通过文档 ID)和一个特定的查询,我想看看它的 _score
是什么?
一种方法可能是查询 ES,检索所有命中的文档,然后从所有检索到的文档中查找所需的文档以查看其分数。
我认为应该有一种更有效的方法来做到这一点。给定一个查询和一个文档 ID,它的_score
是什么?
我正在使用 ElasticSearch 7.x
PS:我需要这个用于学习排名场景(创建我的判断列表)。事实上,我有一个复杂的查询,它是从不同字段上的各种 should
和 must
创建的。我的主要要求是to get the score value for each individual sub-query,这似乎没有解决方案。我想了解这个复杂查询的哪一部分更有用,哪一部分更少。我想出的唯一方法是分别执行每个子查询以获得分数,但我不想实际执行该查询只是询问该子查询的特定文档的分数是多少。
【问题讨论】:
【参考方案1】:文档的评分不仅与索引中的文档和所有其他文档有关,还取决于各种因素,例如:
-
默认情况下,
_score
是基于每个分片而不是基于索引计算的,尽管您可以通过在查询中使用 DFS Query Then Fetch
参数来更改此行为。有关this official blog 的更多信息。
是否在索引或查询时应用了任何提升 (index time is deprecated from 5.X)。
除了默认的 ES 评分算法 (tf/idf in old versions) 和 BM25 in the latest versions. 之外,还使用任何自定义评分函数
编辑:根据其他受人尊敬的社区成员的 cmets,改写以下声明:
要回答您的问题,使用_explain API,您可以了解 Elasticsearch 如何计算查询和特定文档的分数解释。这可以就文档是否匹配特定查询提供有用的反馈。
【讨论】:
使用 _explain,我可以依靠 explain.value 作为该查询+文档的得分值吗?给定一个在实际搜索(查询时间)中排名低于另一个的文档,我会在解释中得到较低的值吗?那么,这将起作用。谢谢:)。 @mhn_namak,是的,如果它出现在您的查询结果中,那么如果它出现在您的查询结果中,那么它在解释中也会得到较低的_score
值,您可以在旧版本和新版本中尝试此 API ES 来理解 diff b/w tf/idf 和 bm25,如果你给 DFS Query Then Fetch
并且你有多个分片,那么相同查询的同一个文档也会有不同的分数和排名,它也提到了提升部分跨度>
@mhn_namak,所以总体上看起来它会起作用并揭示你需要的很多信息:)
@OpsterElasticsearchNinja Explain API does exactly what the person was asking for + 解释如何计算这个值。答案给人的印象是这是不可能的,而且是一种 hack,尽管它不是 hack。
_explain 是回答此类问题的最佳途径,afaik。以上是关于ElasticSearch:给定一个文档和一个查询,相关性得分是多少?的主要内容,如果未能解决你的问题,请参考以下文章
[ElasticSearch]Java API 之 词条查询(Term Level Query)
Elasticsearch:运用 Elasticsearch 查找类似文档:more_like_this