Elasticsearch计算出的分数提供了文档之间的排名,但是并不能说明文档是否与请求匹配。当前,第一个文档可以在所有字段上匹配,也可以只匹配一个。分数提供的唯一信息是它是最匹配的。
是否可能针对查询获得标准化分数?例如,得分为1的文档将完全匹配查询,而得分为0.1的文档将匹配较差。
答案 0 :(得分:0)
简而言之,不,不可能获得查询的真实归一化分数,但是有可能获得足够好的分数归一化,在许多情况下都可以使用。
要获得一个分数来判断该文档是否与某个查询匹配,问题是要找到最适合该查询的文档,从而找到最高分数。使用elasticsearch和大多数(如果不是全部)指标,则最高分不受限制。
即使使用简单的匹配查询,从技术上讲,您也可以通过无限制地重复查询词的文档来获得无限分。没有分数的限制,就不可能获得真正的标准化分数。
但是,所有的希望并没有失去。除了可以对可能的最高分进行归一化之外,您还可以针对应该获得最高分的伪造理想文档进行归一化。例如,如果您要查询带有查询词name
和occupation
的两个字段Jane Doe
和Cook
,则理想文档可以是
{
"name": "Jane Doe",
"occupation": "Cook"
}
如果索引包含名称为Jane Jane Doe
的文档,则理想文档可能无法获得最高分。如果查询的字段相对较短,则可能不必担心术语重复。如果您的字段包含许多术语,则可以决定复制理想文档中经常使用的某些术语。如果目的是确定文档是否匹配良好,则文档得分高于理想文档通常不是问题。
好消息是,如果您至少使用elasticsearch 6.4,则不必索引伪文档即可获得其查询分数。您可以使用端点_scripts/painless/_execute获得理想文档的分数。
GET _scripts/painless/_execute
{
"script": {
"source": "_score"
},
"context": "score",
"context_setup": {
"index": <INDEX>,
"document": <THE_IDEAL_DOCUMENT>,
"query": <YOUR_QUERY>
}
}
请注意,在计算分数时,将考虑虚假文档的字段统计信息,例如包含字段的文档数量和包含查询术语的字段数量。如果您有很多文档,这应该不成问题,但是与以前索引的文档相比,对于字段或术语使用不频繁(例如低于20)的情况,理想文档的得分会更低。