Как настроить эластичную маршрутизацию поиска по существующему индексу?

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

Пример в официальном документе:

$ 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"
  }
}
Другие вопросы по тегам