2015-05-28 5 views
-1

Мы планируем использовать псевдонимы отфильтрованных как упомянуто здесь - https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.htmlElasticSearch Псевдонимы Filtered - Лучшая практика

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

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

ВОПРОС - Как создать псевдоним и индексные данные по-исполнительски?

- Мы индексируем все данные, отслеживаем все уникальные «идентификаторы», а сам конец создает фильтрованный псевдоним? OR

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

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

TIA.

+0

Сколько у вас показателей? Сколько данных вы собираетесь индексировать? После того, как вы проиндексировали свой первоначальный набор данных, будет ли больше данных, поступающих с разными идентификаторами, что потребует создания новых фильтрованных псевдонимов? – Val

+0

@Val. Для моего приложения есть только один индекс (у нас есть общий кластер ES, который также использует и другое приложение). Выполняется ежедневная работа, которая заполняет данные в ES, мы видим, что она составляет не более 10 миллионов экземпляров (при каждом запуске). Да, в каждом последующем прогоне мы можем добавлять новые записи, соответствующие различным идентификаторам, для чего требуется создание новых фильтрованных псевдонимов. – curiouscoder

+0

Хорошо и еще одна вещь: какова мощность этого поля идентификатора (т. Е. Сколько уникальных идентификаторов существует примерно)? – Val

ответ

1

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

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

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

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

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

UPDATE:

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

  1. Первый индекс ваши ежедневные данные
  2. Затем запустите a terms на вашем customer_id поле с size достаточно высоким (т.е.выше, чем мощность поля, которое было ~ 100 в вашем случае), чтобы убедиться, что вы захватить все уникальные идентификаторы клиентов для создания псевдонимов
  3. Ленты по всем ведрам, чтобы получить все уникальные идентификаторы клиента
  4. Создать все псевдонимы в one shot используя один 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" } } 
      } 
     }, 
     ... 
    ] 
}' 

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

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

+0

Большое спасибо, Val. Мы планируем скоро перейти на ES 1.5, так что _routing, возможно, не работает? В этом случае, какой будет альтернативный подход? – curiouscoder

+0

Вы всегда можете использовать параметр маршрутизации при индексировании ваших документов, независимо от того, является ли [одноразовым] (https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#index-routing) или через [объемный API] (https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html#bulk-routing) – Val

+0

Я понимаю сейчас :-). Итак, каково значение псевдонима фильтра? Только для полного раскрытия, какой подход был бы наиболее эффективным (мой первоначальный вопрос), если бы я действительно создал фильтрованный псевдоним? Благодарю. – curiouscoder

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

  • Нет связанных вопросов^_^