2015-12-09 2 views
0

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

Пример в official doc является:

$ curl -XPUT 'http://localhost:9200/store/order/_mapping' -d ' 
{ 
    "order":{ 
     "_routing":{ 
     "required":true, 
     "path":"customerID" 
     } 
    } 
} 

После этого, мне нужно индексировать четной восстановить весь индекс?

+0

На самом деле в документе говорится: «ПРЕДУПРЕЖДЕНИЕ: извлечение пользовательской маршрутизации из документа больше не поддерживается, оно удалено в Elasticsearch v2.0». –

ответ

0

Если вы хотите изменить поведение маршрутизации в существующем типе сопоставления, вам необходимо создать новый индекс, воссоздать тип отображения и переиндексировать ваши данные. Я не думаю, что даже можно изменить _routing на существующий тип сопоставления. Даже если вы видите acknowledged: true, часть _routing, вероятно, вообще будет проигнорирована. Вы можете выполнить команду сопоставления обновлений выше, а затем проверить сопоставление, чтобы узнать, имеет ли ваш тип сопоставления новый _routing, но я уверен, что этого не произойдет.

Причина связана с тем, как работает маршрутизация. Если бы можно было динамически обновлять маршрутизацию, вы могли бы оказаться в том же документе, что и на двух разных осколках того же индекса. В первый раз, когда вы проиндексировали документ (без маршрутизации), документ, возможно, попал в shard1, а затем во второй раз, когда вы индексируете документ (с маршрутизацией), тот же документ может оказаться на shard3. Это означает, что в вашем индексе будет дублированный документ, что, вероятно, не является желаемым поведением.

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

+0

Спасибо за подробный ответ! – Kewei

+0

Здравствуйте, @val, как вы можете использовать reindex API с пользовательской маршрутизацией таким образом? ура –

+0

@ThomasDecaux Да, вы можете, как [описано в официальной документации] (https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html) – Val

0

Извлечение пользовательской маршрутизации из документа больше не поддерживается после elasticsearch 2.0 и далее. https://github.com/elastic/elasticsearch/pull/11074 Если вы хотите добавить маршрутизацию в существующий индекс, вам может потребоваться сделать что-то вроде этого. Итерации по всем customerIDs и использование _reindex api для reindex.

POST _reindex 
{ 
    "source": { 
    "index": "source", 
    "query": { 
     "match": { 
     "customerIDs": "customerid1" 
     } 
    } 
    }, 
    "dest": { 
    "index": "dest", 
    "routing": "customerid1" 
    } 
} 
Смежные вопросы