当从一系列关键字中搜索关键字数组时,有人可以建议我如何在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)
但我不想仅仅确定它们是否匹配,而是想使用一种非常具体的评分算法:

对单个字段进行评分很简单,但我不知道如何使用数组进行管理.有什么想法吗?
啊一个有趣的问题!(我认为我们可以通过一些沟通来解决)
首先,您看过自定义脚本评分吗?我很确定你可以慢慢地做到这一点。如果您要这样做,我会考虑进行重新评分阶段,仅在已知文档成功后才计算评分。
不过我认为你可以使用 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具有不同提升的查询(对于第二个术语的权重)文档)。
让我知道你的想法!一个非常非常有趣的问题。
| 归档时间: |
|
| 查看次数: |
1280 次 |
| 最近记录: |