ElasticSearch自定义评分与数组

时间:2013-08-21 09:41:22

标签: 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
                },
        ]
},
...

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

{
    keywords : [
            red : {
                    weight : 2.2
                }, 
            blue : {
                    weight : 3.3
                },
        ]
}

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

enter image description here

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

1 个答案:

答案 0 :(得分:1)

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

首先,你看过自定义脚本评分了吗?我很确定你能做到这一点慢慢地。如果你这样做我会考虑做一个rescore phase,其中只有在知道doc是一个命中后计算得分。

然而我认为你可以用elasticsearch机器做到这一点。正如我可以解决的那样,你在docs之间做了一个点积(其中权重实际上是你指定的和你指定的一半)。

所以,我的第一个建议是从你的“自定义评分”(点积)中删除x / 2n术语,并将你的权重放在1和自定义权重之间(例如1.9 => 1.45)。

...对不起,我将不得不回来编辑这个问题。我正在考虑使用带有字段定义的提升级别的嵌套文档,但是,_boost映射参数是only available for the root doc

P.S。只是想一想,你可以拥有定义提升等级的字段并在那里存储术语,然后你可以很容易地做到这一点,但你的精确度会下降。然后,文档看起来像:

{
  "boost_1": ["aquamarine"],
  "boost_2": null, //don't need to send this, just showing for clarity
  ...
  "boost_5": ["burgundy", "fuschia"]
  ...
}

然后,您可以在映射中定义这些增强功能。需要注意的一点是,字段提升值会转移到_all字段,因此您现在可以在_all字段中添加一包加权字词,然后您可以构建bool: should个查询,有大量term个查询,具有不同的提升(对于第二个文档的权重)。

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