Основываясь на нашем обсуждении выше и после просмотра статьи в блоге, которую вы опубликовали, я уверен, что в вашем случае вам не нужны псевдонимы вообще, и ключа маршрутизации будет достаточно. Опять же, только потому, что у вас есть один индекс, если у вас было много индексов, это было бы неверно!
Вам просто нужно указать ключ маршрутизации, который будет использоваться при индексировании вашего документа. До 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:
Теперь, если вы абсолютно/хотите создать отфильтрованные псевдонимами, тем более производительным способом будет первым вы упомянули:
- Первый индекс ваши ежедневные данные
- Затем запустите a
terms
на вашем customer_id
поле с size
достаточно высоким (т.е.выше, чем мощность поля, которое было ~ 100 в вашем случае), чтобы убедиться, что вы захватить все уникальные идентификаторы клиентов для создания псевдонимов
- Ленты по всем ведрам, чтобы получить все уникальные идентификаторы клиента
- Создать все псевдонимы в 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" } }
}
},
...
]
}'
Обратите внимание, что вам не придется беспокоиться, если псевдоним уже существует, то вся команда не будет прервана и молча игнорировать ю существующий псевдоним.
Когда эта команда запущена, вы будете иметь все свои псевдонимы в своем уникальном индексе, правильно настроенном с фильтром и ключом маршрутизации.
Сколько у вас показателей? Сколько данных вы собираетесь индексировать? После того, как вы проиндексировали свой первоначальный набор данных, будет ли больше данных, поступающих с разными идентификаторами, что потребует создания новых фильтрованных псевдонимов? – Val
@Val. Для моего приложения есть только один индекс (у нас есть общий кластер ES, который также использует и другое приложение). Выполняется ежедневная работа, которая заполняет данные в ES, мы видим, что она составляет не более 10 миллионов экземпляров (при каждом запуске). Да, в каждом последующем прогоне мы можем добавлять новые записи, соответствующие различным идентификаторам, для чего требуется создание новых фильтрованных псевдонимов. – curiouscoder
Хорошо и еще одна вещь: какова мощность этого поля идентификатора (т. Е. Сколько уникальных идентификаторов существует примерно)? – Val