ElasticSearch Создание фильтрованных псевдонимов - лучшая практика

Мы планируем использовать фильтрованные псевдонимы, как указано здесь - https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html

Наши входные данные будут представлять собой поток, каждая строка которого соответствует объекту, который мы хотели бы сохранить в ES.

Каждый объект содержит идентификатор, который мы используем для маршрутизации и фильтрации.

ВОПРОС - Как мы можем создать псевдоним и индексировать данные эффективным способом?

- Индексируем ли мы все данные, отслеживаем ли все уникальные идентификаторы и в самом конце создаем отфильтрованный псевдоним? ИЛИ ЖЕ

- для каждого объекта проверьте, существует ли псевдоним для этого идентификатора; если это не создает?

Я склоняюсь к первому подходу. Целесообразно ли это по сравнению со вторым подходом?

ТИА.

1 ответ

Решение

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

Вам просто нужно указать ключ маршрутизации, который будет использоваться при индексации документа. До ES 2.0 вы можете использовать _routing поле для этой цели, даже если это не рекомендуется в ES 1.5, но в вашем случае это служит вашей цели.

{
    "customer" : {
        "_routing" : {
            "required" : true,
            "path" : "customer_id"     <----- the field you use as the routing key
        },
        "properties": { ... }
    }
}

Тогда при поиске нужно просто указать &routing=<customer_id> в вашем поисковом URL-адресе в дополнение к фильтру идентификаторов клиентов (поскольку данный фрагмент может содержать документы для разных клиентов). Ваш поиск будет идти непосредственно к фрагменту, идентифицированному данным ключом маршрутизации, и, таким образом, только получать данные от указанного клиента.

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

ОБНОВИТЬ:

Теперь, если вы абсолютно хотите / хотите создать отфильтрованные псевдонимы, первым будет упомянут более эффективный способ:

  1. Сначала индексируйте ваши ежедневные данные
  2. Затем запустите terms агрегация на вашем customer_id поле с size достаточно высокий (т. е. выше, чем количество элементов в поле, которое в вашем случае составляло ~100), чтобы обеспечить захват всех уникальных идентификаторов клиентов для создания псевдонимов
  3. Перебрать все корзины, чтобы получить все уникальные идентификаторы клиентов
  4. Создайте все псевдонимы в одном кадре, используя один action для каждого customer_id
curl -XPOST 'http://localhost:9200/_aliases' -d '{
    "actions" : [
        {
            "add" : {
                 "index" : "customers",
                 "alias" : "alias_cid1",
                 "routing" : "cid1",
                 "filter" : { "term" : { "customer_id" : "cid1" } }
            }
        },
        {
            "add" : {
                 "index" : "customers",
                 "alias" : "alias_cid2",
                 "routing" : "cid2",
                 "filter" : { "term" : { "customer_id" : "cid2" } }
            }
        },
        {
            "add" : {
                 "index" : "customers",
                 "alias" : "alias_cid3",
                 "routing" : "cid3",
                 "filter" : { "term" : { "customer_id" : "cid3" } }
            }
        },
        ...
    ]
}'

Обратите внимание, что вам не нужно беспокоиться, если псевдоним уже существует, вся команда не потерпит неудачу и молча проигнорирует существующий псевдоним.

Когда эта команда будет выполнена, у вас будут все псевдонимы в вашем уникальном индексе, правильно настроенные с помощью фильтра и ключа маршрутизации.

Другие вопросы по тегам