简而言之,不,不可能为查询获得真正的归一化分数,但可以获得在许多情况下都有效的足够好的分数归一化。
获得分数以判断文档是否适合查询的问题是找到最适合该查询的文档,从而获得最大分数。使用 elasticsearch 和大多数(如果不是全部)指标,最高分数是没有界限的。
即使使用简单的匹配查询,从技术上讲,您也可以通过无限次重复查询词的文档获得无限分。没有对分数的限制,就不可能得到真正的归一化分数。
但所有的希望都没有落空。您可以针对应该获得最高分数的虚假理想文档进行标准化,而不是针对可能的最佳分数进行标准化。例如,如果您使用查询词Jane Doe 和Cook 查询两个字段name 和occupation,那么您的理想文档可以是
{
"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),您会注意到与以前索引的文档相比,理想文档的得分较低。