如何查找文档是否适合查询,例如规范化Elasticsearch得分?

时间:2019-05-31 06:41:24

标签: elasticsearch

Elasticsearch计算出的分数提供了文档之间的排名,但是并不能说明文档是否与请求匹配。当前,第一个文档可以在所有字段上匹配,也可以只匹配一个。分数提供的唯一信息是它是最匹配的。

是否可能针对查询获得标准化分数?例如,得分为1的文档将完全匹配查询,而得分为0.1的文档将匹配较差。

1 个答案:

答案 0 :(得分:0)

简而言之,不,不可能获得查询的真实归一化分数,但是有可能获得足够好的分数归一化,在许多情况下都可以使用。

要获得一个分数来判断该文档是否与某个查询匹配,问题是要找到最适合该查询的文档,从而找到最高分数。使用elasticsearch和大多数(如果不是全部)指标,则最高分不受限制。

即使使用简单的匹配查询,从技术上讲,您也可以通过无限制地重复查询词的文档来获得无限分。没有分数的限制,就不可能获得真正的标准化分数。

但是,所有的希望并没有失去。除了可以对可能的最高分进行归一化之外,您还可以针对应该获得最高分的伪造理想文档进行归一化。例如,如果您要查询带有查询词nameoccupation的两个字段Jane DoeCook,则理想文档可以是

{
    "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)的情况,理想文档的得分会更低。