在搜索关键字数组中的关键字数组时,有人可以建议我如何在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
},
]
}
但我不想仅仅确定它们是否匹配,而是想使用一种非常具体的评分算法:
评分单个字段很简单,但我不知道如何使用数组进行管理。有什么想法吗?
答案 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
个查询,具有不同的提升(对于第二个文档的权重)。
让我知道你的想法!一个非常非常有趣的问题。