5

在从关键字数组中搜索关键字数组时,谁能建议我如何在 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
                },
        ]
}

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

在此处输入图像描述

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

4

1 回答 1

1

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

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

但是我认为您可以使用弹性搜索机制来做到这一点。据我所知,您正在文档之间进行点积(其中权重实际上是您指定的值和 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"]
  ...
}

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

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

于 2013-08-21T11:52:50.937 回答