Как настроить эластичную маршрутизацию поиска по существующему индексу?
У меня есть индекс, который использует маршрутизацию по умолчанию из эластичного поиска. Теперь я хочу настроить свою собственную маршрутизацию, как мне это реализовать?
Пример в официальном документе:
$ curl -XPUT 'http://localhost:9200/store/order/_mapping' -d '
{
"order":{
"_routing":{
"required":true,
"path":"customerID"
}
}
}
После этого, мне нужно переиндексировать даже перестроить весь индекс?
2 ответа
Если вы хотите изменить поведение маршрутизации в существующем типе отображения, вам нужно создать новый индекс, воссоздать тип отображения и повторно проиндексировать ваши данные. Я не думаю, что это даже возможно изменить _routing
на существующий тип отображения. Даже если вы видите acknowledged: true
, _routing
часть, вероятно, будет полностью проигнорирована. Вы можете выполнить приведенную выше команду обновления сопоставления, а затем проверить сопоставление, чтобы увидеть, имеет ли ваш тип сопоставления новый _routing
, но я уверен, что это не так.
Причина в том, как работает маршрутизация. Если бы можно было динамически обновлять маршрутизацию, вы могли бы получить один и тот же документ в двух разных сегментах одного и того же индекса. При первом индексировании документа (без маршрутизации) документ мог оказаться в shard1, затем во второй раз при индексации документа (с маршрутизацией) тот же документ мог оказаться в shard3. Это означает, что в вашем индексе будет дублирующийся документ, что, вероятно, является нежелательным поведением.
Поскольку легко создавать новые индексы и типы отображения, в случае сомнений просто создайте новый индекс с нуля и переиндексируйте свои данные. Вы будете тратить меньше времени на выяснение того, почему ваш запрос возвращает странные результаты.
Извлечение настраиваемой маршрутизации из документа больше не поддерживается после эластичного поиска 2.0 и выше. https://github.com/elastic/elasticsearch/pull/11074 Если вы хотите добавить маршрутизацию к существующему индексу, вам может потребоваться сделать что-то подобное. Перебрать все customerIDs
и использовать _reindex
API для переиндексации.
POST _reindex
{
"source": {
"index": "source",
"query": {
"match": {
"customerIDs": "customerid1"
}
}
},
"dest": {
"index": "dest",
"routing": "customerid1"
}
}