ElasticSearch自定义评分与数组

Sal*_*eri 5 elasticsearch

当从一系列关键字中搜索关键字数组时,有人可以建议我如何在ElasticSearch中进行自定义评分吗?

例如,假设每个文档中都有一系列关键字,如下所示:

{ // doc 1
    keywords : [ 
            red : {
                    weight : 1
                }, 
            green : {
                    weight : 2.0
                },
            blue : {
                    weight: 3.0
                },
            yellow : {
                    weight: 4.3
                }
        ]
},
{ // doc 2
    keywords : [ 
            red : {
                    weight : 1.9
                }, 
            pink : {
                    weight : 7.2
                },
            white : {
                    weight: 3.1
                },
        ]
},
...
Run Code Online (Sandbox Code Playgroud)

我希望根据匹配此数组的关键字的搜索获得每个文档的分数:

{
    keywords : [
            red : {
                    weight : 2.2
                }, 
            blue : {
                    weight : 3.3
                },
        ]
}
Run Code Online (Sandbox Code Playgroud)

但我不想仅仅确定它们是否匹配,而是想使用一种非常具体的评分算法:

在此输入图像描述

对单个字段进行评分很简单,但我不知道如何使用数组进行管理.有什么想法吗?

ram*_*laf 1

啊一个有趣的问题!(我认为我们可以通过一些沟通来解决)

首先,您看过自定义脚本评分吗?我很确定你可以慢慢地做到这一点。如果您要这样做,我会考虑进行重新评分阶段,仅在已知文档成功后才计算评分。

不过我认为你可以使用 Elasticsearch 机制来做到这一点。据我所知,您正在文档之间进行点积(其中权重实际上是您指定的值和 1 之间的一半)。

因此,我的第一个建议是从“自定义评分”(点积)中删除 x/2n 项,并将权重置于 1 和自定义权重之间的一半(例如 1.9 => 1.45)。

...很抱歉,我必须回来编辑这个问题。我正在考虑使用具有字段定义的增强级别的嵌套文档,但是可惜的是,_boost映射参数仅适用于根文档

ps 只是有一个想法,您可以拥有定义了增强级别的字段并在那里存储术语,然后您可以轻松地做到这一点,但会失去精度。文档将如下所示:

{
  "boost_1": ["aquamarine"],
  "boost_2": null, //don't need to send this, just showing for clarity
  ...
  "boost_5": ["burgundy", "fuschia"]
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在映射中定义这些提升。需要注意的一件事是字段提升值会转移到该_all字段,因此您现在在字段中将有一袋加权术语_all,然后您可以构建一个bool: should查询,其中包含许多term具有不同提升的查询(对于第二个术语的权重)文档)。

让我知道你的想法!一个非常非常有趣的问题。