Фильтрация по приоритету на основе ключа документа в Elasticsearch - PullRequest
1 голос
/ 24 сентября 2019

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

Чтобы выполнить дедупликацию при обслуживании запросов, я вижу 2 способа:

  1. Получить Elasticsearch для выполнения приоритетной фильтрации.
  2. Получить все и отфильтровать через Python

Я предпочитаю не фильтровать на уровне Python, чтобы сохранить нумерацию страниц, поэтому я хочу спросить, есть лиспособ указать Elasticsearch на приоритетный фильтр на основе некоторого значения в документе (в моем случае, источника).

Я хочу отфильтровать по простому приоритету (поэтому, если мой порядок A, B, C, я будуобслуживать документ A, если он существует, затем B, если документ из источника A не существует, за которым следует C).

Пример набора дубликатов документов будет выглядеть следующим образом:

{
"id": 1,
"source": "A",
"rest_of": "data",
...
},
{
"id": 1,
"source": "B",
"rest_of": "data",
...
},
{
"id": 1,
"source": "C",
"rest_of": "data",
...
}

Но если я хочу служить «A» ПЕРВЫМ, то «B», если нет «A», а затем «C», если нет «B», результат поиска для «id»: 1 будет выглядеть так:

{
"id": 1,
"source": "A",
"rest_of": "data",
...
}

Примечание: в качестве альтернативы, я мог бы попытаться дедуплицировать в популяциинет, но я беспокоюсь о производительности.Готов исследовать это, если нет простого способа реализации решения 1.

1 Ответ

0 голосов
/ 24 сентября 2019

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

Довольно простой подход может бытьсоздать идентификатор документа ElasticSearch с единообразным методом для всех источников.Вы действительно можете заставить _id при индексировании вместо того, чтобы позволить ES сгенерировать его для вас.

В таком случае произойдет то, что последний пришедший источник переопределит существующий, если он существует.Последний пришел впереди.Если вас не волнует source, это может сработать.

Однако это требует небольших затрат производительности, как указано в этой статье :

Как вы видели в этом сообщении в блоге, можно предотвратить дублирование в Elasticsearch, указав идентификатор документа извне перед индексацией данных в Elasticsearch.Тип и структура идентификатора могут оказать существенное влияние на производительность индексации.Однако это будет отличаться в зависимости от варианта использования, поэтому рекомендуется провести сравнительный анализ, чтобы определить, что является оптимальным для вас и вашего конкретного сценария.

...