在ElasticSearch中进行惩罚 - 但不能消除重复

时间:2017-02-16 16:02:20

标签: elasticsearch duplicates

我有一些重复字段的数据。我不希望重复项一起显示在搜索结果的顶部,但我不想完全消除它们。我只想获得更好的变化,因此相同的字段值的第2,第3 ......第n次出现将被降级。 ElasticSearch可以吗?

例如:

curl -XPOST 'http://localhost:9200/employeeid/info/1' -d '{
 "name": "John",
 "organisation": "Apple",
 "importance": 1000
}'

curl -XPOST 'http://localhost:9200/employeeid/info/2' -d '{
 "name":"John",
 "organisation":"Apple",
 "importance": 2000
 }'

curl -XPOST 'http://localhost:9200/employeeid/info/3' -d '{
 "name": "Sam",
 "organisation": "Apple",
 "importance": 0
 }'

(基于this

如果我们假设搜索受到重要性的提升,“Apple”搜索的自然结果将是JohnJohnSam。我要找的是一种方法来制作结果JohnSamJohn,即惩罚第二个John,因为另一个John已经出现。

1 个答案:

答案 0 :(得分:3)

您可以通过查找所有重复项并选择其中一个重复项来“更重要”来调整索引时的重要性字段 - 也许选择具有最高分数的副本。从您的示例中,我将为现有的重要值添加5000。

结果现在排名如下。

John / Apple-7000,Sam / Apple-5000,John / Apple-1000

但这意味着如果您决定将5000更改为10000以调整得分,则需要重新编制索引,因为它取决于重要性的大小。

或者,您可以添加另一个名为“权限”的字段,您可以为重要性最高的副本指定值1,并使用评分函数在查询时提供步骤: -

"script_score": {
   "script": "(_score * 5000) + doc['importance'].value + (doc['authority'].value * 5000)"
}

请注意,_score的乘数取决于原始排名算法,这假设_score的值为0.0到1.0