2016-10-18 2 views
0

Что делать, если я изменил отображение для своего индекса и хочет переиндексировать?Elasticsearch Reindexing при обновлении документов?

Я использую Java API, который еще не имеет функции reindex, поэтому использование большого объема решит мои проблемы. Таким образом, решение будет выглядеть как этот

исх How to reindex in ElasticSearch via Java API

Долгое время назад

  • создать индекс MY_INDEX_1
  • создать отображение для MY_INDEX_1
  • создать псевдоним MY_INDEX_1 -> MY_INDEX
  • создавать документы в MY_INDEX

Время переосмысления!

  • Элемент списка
  • создать индекс MY_INDEX_2
  • создать отображение для MY_INDEX_2
  • поиска свитки + налива всех документы из MY_INDEX_1 в MY_INDEX_2

переименование и удаление старого индекса

  • создать псевдоним MY_INDEX_2 -> MY_INDEX
  • удаления псевдонима MY_INDEX_1 -> MY_INDEX
  • удалить индексировать MY_INDEX_1

Но что происходит, в то время переиндексации всех документов, документ, который был переиндексирован в начале обновлялся из пользователь. Или что между переиндексированием и переименованием псевдонимов вышеприведенные события?

Возможные решения?

  • Один из способов будет использовать внешнюю версию, например, она не перезаписывает документ с более высокой версией
  • Или, может быть решена по-другому?
  • Или между переименованием псевдонимов и удалением my_index_1, переиндексированием всех документов, которые были проиндексированы с момента переиндексации? Но тогда все же было бы так, что документ был обновлен между переименованием псевдонимов и вторым переиндексированием
  • Или мы должны блокировать при повторной передаче? Похоже, плохое решение ..

ответ

0

Я думаю, что это ваш реальный вопрос:

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

Я просто asked a question Это очень близко, но все еще есть вопросы, которые необходимо решить отдельно. Однако мои исследования позволяют мне ответить на этот вопрос. См. Вопрос для деталей и ссылок.

Чтобы ответить на ваш вопрос, вы создаете второй псевдоним перед переиндексацией. Я называю это duplicate_write_alias, и у вас есть приложение, если он видит этот второй псевдоним, сначала напишите старый, а затем новый индекс с помощью двух псевдонимов. (порядок важен для отмены потенциальной расы). Когда индексирование завершено, процесс индексирования удаляет этот duplicate_write_alias и перемещает ваш псевдоним MY_INDEX в новый MY_INDEX_2, как указано выше. Переключите псевдоним в one atomic command.

Как я уже отмечал в своем вопросе, вам по-прежнему приходится иметь дело с потенциальными ошибками «индекс не существует» из-за оставшейся гонки между проверкой вашего приложения на наличие псевдонима и удаляемого псевдонима. Я надеюсь, что есть лучший ответ, чем «всегда писать дважды и игнорировать ошибки» или «проверять и надеяться на лучшее» ...