2015-03-03 3 views
3

Я хотел бы увеличить оценку документа по популярности. Я бы хотел, чтобы это было как можно больше в режиме реального времени.Альтернативы для оценки в реальном времени по популярности с elasticsearch

Для удовлетворения потребностей в реальном времени, кажется, мне приходится переиндексировать каждый документ каждый раз, когда его популярность изменяется (за просмотр). Это кажется крайне неэффективным.

Альтернативой является запуск пакетного процесса, который периодически переопределяет документы, которые были недавно просмотрены, но это становится меньше в режиме реального времени и по-прежнему требует повторной индексации целых документов, когда изменилось только одно поле (популярность) ,

Третий подход (который мы реализовали) заключается в использовании плагина для захвата популярности документа из внешнего источника и использования сценария для включения его в подсчет очков. Это также работает, но замедляет поиск больших пространств документов. Использование rescore помогает, но только позволяет сортировать подмножество возвращенных документов.

Есть ли лучший вариант (способ повысить популярность индекса без переиндексации всего документа или лучшего способа интеграции внешних данных с помощью упругого поиска)?

ответ

0

Мы реализовали гибрид вашего второго и третьего подхода. У нас был внешний источник (в нашем случае БД), в котором хранились значения популярности для id документа и все запросы относительно популярности там, где он служил. Кроме того, у нас был cron, который обновлял все документы каждый час путем переиндексации. Причина, по которой мы переиндексированы, состоит в том, что мы провели другой анализ, сделанный в документе, который нуждался в новой популярности, но технически вы можете иметь только db, поскольку он обслуживает все запросы.

DB значительно быстрее, когда дело доходит до получения номера для документа doc, чем поиск по дереву/lucene/solr. Надеюсь это поможет.

1

Вы можете попробовать следующее, чтобы иметь поле популярности в реальном времени.

  1. Включите в себя популярное поле как часть вашего индекса.

  2. Увеличивает популярность каждый раз, когда документ извлекается. Вы можете сделать это, используя частичное обновление скриптов.

  3. Используйте запрос оценки функции, чтобы увеличить документ.

Java API:

new FunctionScoreQueryBuilder(matchQuery("canonical_name", 
           phrase).analyzer("standard") 
           .minimumShouldMatch("100%")).add(
           fieldValueFactorFunction("popularityScore") 
             .modifier(Modifier.LOG1P).factor(2f)) 
           .boostMode("sum")) 

http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/boosting-by-popularity.html

Смежные вопросы