Переиндексация в Elasticsearch 1.7
Существует проблема с нашими отображениями для эластичного поиска 1.7. Я исправляю проблему, создавая новый индекс с правильными сопоставлениями. Я понимаю, что, поскольку я создаю новый индекс, мне придется переиндексировать старый индекс с существующими данными в новый индекс, который я только что создал. Проблема в том, что я погуглил и не могу найти способ переиндексации от старого к новому. Похоже, API переиндексации был введен в ES 2.3 и не поддерживается для 1.7.
Мой вопрос заключается в том, как мне переиндексировать мои данные из старых в новые после исправления моих отображений. В качестве альтернативы, каков наилучший способ внесения изменений в ES 1.7?
- https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html не будет работать для меня, потому что мы находимся на старой версии ES (1.7)
- https://www.elastic.co/blog/changing-mapping-with-zero-downtime Изначально пошел по этому пути, но застрял, нужен способ переиндексации старого в новое
2 ответа
Опоздал на ваш случай использования, но хотел выложить его для других. Это отличное пошаговое руководство по переиндексации индекса Elasticsearch с использованием Logstash версии 1.5 при сохранении целостности исходных данных: http://david.pilato.fr/blog/2015/05/20/reindex-elasticsearch-with-logstash/
Это logstash-simple.conf
автор создает:
Input {
# We read from the "old" cluster
elasticsearch {
hosts => [ "localhost" ]
port => "9200"
index => "index"
size => 500
scroll => "5m"
docinfo => true
}
}
filter {
mutate {
remove_field => [ "@timestamp", "@version" ]
}
}
output {
# We write to the "new" cluster
elasticsearch {
host => "localhost"
port => "9200"
protocol => "http"
index => "new_index"
index_type => "%{[@metadata][_type]}"
document_id => "%{[@metadata][_id]}"
}
# We print dots to see it in action
stdout {
codec => "dots"
}
Есть несколько вариантов для вас:
использовать logstash - очень легко создать конфигурацию переиндексации в logstash и использовать ее для переиндексации ваших документов. например:
input {
elasticsearch {
hosts => [ "localhost" ]
port => "9200"
index => "index1"
size => 1000
scroll => "5m"
docinfo => true
}
}
output {
elasticsearch {
host => "localhost"
port => "9200"
protocol => "http"
index => "index2"
index_type => "%{[@metadata][_type]}"
document_id => "%{[@metadata][_id]}"
}
}
Проблема этого подхода в том, что он будет относительно медленным, поскольку у вас будет только одна машина, которая выполняет процесс переиндексации.
другой вариант, используйте этот инструмент. Это будет быстрее, чем logstash, но вам придется обеспечить логику сегментации для всех ваших документов, чтобы ускорить обработку. Например, если у вас есть числовые поля, значения которых находятся в диапазоне от 1 до 100, то вы можете сегментировать запросы в инструменте, возможно, на 10 интервалов (1–10, 11–20, ... 91–100), поэтому инструмент вызовет 10 индексаторов, которые будут работать параллельно, переиндексируя ваш старый индекс.