Elasticsearch计算出的分数提供了文档之间的排名,但是无法判断文档是否与请求匹配。当前,第一个文档可以在所有字段上匹配,也可以只匹配一个。分数提供的唯一信息是它是最佳匹配。
是否有可能获得关于查询的标准化分数?例如,得分为1表示文档与查询完全匹配,得分为0.1表示文档匹配程度很差。
简而言之,不是,不可能获得查询的真实归一化分数,但是有可能获得足够好的分数归一化,在许多情况下都可以使用。
获得分数以判断该文档是否与查询匹配的问题是找到最适合该查询的文档,从而找到最高分数。使用elasticsearch和大多数(如果不是全部)度量标准,最大分数不受限制。
即使使用简单的匹配查询,从技术上讲,您也可以通过无限次重复查询词的文档获得无限分。没有分数的限制,就不可能获得真正的标准化分数。
但是,所有的希望都不会丢失。除了可以对可能的最高分进行归一化之外,您还可以针对应该获得最高分的伪造理想文档进行归一化。例如,如果您要查询两个字段name并occupation使用查询词Jane Doe,则Cook理想文档可以是
name
occupation
Jane Doe
Cook
{ "name": "Jane Doe", "occupation": "Cook" }
如果索引包含一个文档(例如名称),Jane Jane Doe则理想文档可能不会获得最高分。如果查询的字段相对较短,则可能不必担心术语重复。如果您的字段中包含许多术语,则可以决定复制理想文档中常用的一些术语。如果目的是确定文档是否匹配良好,则文档得分高于理想文档通常不是问题。
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),您会发现理想文档的得分较低。