2017-02-16 14 views
8

У меня есть данные с повторяющимися полями. Я не хочу, чтобы дубликаты отображались вместе поверх результатов поиска, но я не хочу их полностью исключать. Я просто хочу получить лучшее разнообразие, поэтому второе, третье ... n-е вхождение одного и того же значения поля будет понижено в сторону. Возможно ли это с помощью ElasticSearch?Пенификация - но не устранение дубликатов - в 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" поиск будет John, John, Sam. То, что я ищу, - это способ сделать результат John, Sam, John, то есть наказывать второй John, потому что еще John уже появился.

+0

я считаю возможным решением является использование скриптов и скоринг: https://www.elastic.co/ guide/en/elasticsearch/reference/current/modules-scripting-painless.html, https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-advan ced-scripting.html. –

ответ

3

Вы можете настроить поле важности за время индекса, найдя все дубликаты и выбрав один из дубликатов, чтобы быть «более важным» - возможно, выбран дубликат с наивысшим баллом. Из вашего примера я бы добавил 5000 к существующей ценности важности.

Результаты теперь будут оцениваться следующим образом.

Джон/Apple-7000, Сэм/Apple-5000, Джон/Apple-1000

Но это означает, что вам нужно будет повторно индекс, если вы решили изменить 5000 до 10000, чтобы настроить счет как это зависит от величины важности.

В качестве альтернативы, вы можете добавить еще одно поля под названием «власть», для которого вы могли бы дать значение 1 для дубликата с наибольшей важностью и использовать функцию подсчета очков, чтобы обеспечить пошаговый запрос время: -

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

Заметим, что множитель для _SCORE зависит от исходного алгоритма ранжирования, это предполагает, что значение для _SCORE от 0,0 до 1,0

+1

_score связывается между 0 и 1, как вы думаете, это будет иметь такое значение для ваших вычислений с полем «авторитет»? – Adonis

+0

спасибо. Хорошая точка - я могу настроить и добавить примечание о _score, поскольку это зависит от исходного алгоритма оценки. – abdollar

+0

Спасибо. Я надеюсь, что в будущем будет более прямой путь, но некоторые дополнительные работы по индексированию, подобные этому, могут это сделать. – mahemoff