简而言之,不,不可能获得查询的真正标准化分数,但可以获得在许多情况下有效的足够好的分数标准化。
获得一个分数来判断文档是否适合查询的问题是找到最适合该查询的文档,从而找到最大分数。使用 Elasticsearch 和大多数(如果不是全部)指标,最高分数不受限制。
即使使用简单的匹配查询,从技术上讲,您也可以通过无限次重复查询术语的文档达到无限分数。如果没有分数限制,就不可能获得真正的标准化分数。
但我们并没有失去所有的希望。您可以根据应该获得最高分数的虚假理想文档进行标准化,而不是针对最佳得分进行标准化。例如,如果您要查询两个字段name
and occupation
带有查询条件Jane Doe
and Cook
您理想的文档可以是
{
"name": "Jane Doe",
"occupation": "Cook"
}
如果索引包含一个文档,例如名称为Jane Jane Doe
那么理想的文档可能无法获得最高分。如果查询的字段相对较短,您可能不必担心术语重复。如果您的字段包含许多术语,您可能会决定复制一些在理想文档中常见的术语。如果目标是确定文档是否匹配良好,那么文档得分高于理想文档通常不是问题。
好消息是,如果您至少使用 Elasticsearch 6.4,则无需索引虚假文档即可获取其查询分数。您可以使用端点_脚本/无痛/_执行 https://www.elastic.co/guide/en/elasticsearch/painless/6.4/painless-execute-api.html以获得理想文档的分数。
GET _scripts/painless/_execute
{
"script": {
"source": "_score"
},
"context": "score",
"context_setup": {
"index": <INDEX>,
"document": <THE_IDEAL_DOCUMENT>,
"query": <YOUR_QUERY>
}
}
请注意,在计算分数时,将考虑虚假文档的字段统计信息,例如包含某个字段的文档数量和包含查询术语的字段数量。如果您有很多文档,这应该不是问题,但对于非常不频繁的字段或术语(例如低于 20),您可能会注意到与之前索引的文档相比,理想文档的分数较低。