Elasticsearch Mapping - переименовать существующее поле
Можно ли в любом случае переименовать элемент в существующем отображении эластичного поиска, не добавляя новый элемент? Если это так, что является лучшим способом сделать это, чтобы избежать нарушения существующего отображения?
например, от fieldCamelcase к fieldCamelCase
{
"myType": {
"properties": {
"timestamp": {
"type": "date",
"format": "date_optional_time"
},
"fieldCamelcase": {
"type": "string",
"index": "not_analyzed"
},
"field_test": {
"type": "double"
}
}
}
}
1 ответ
Вы можете сделать это, создав конвейер Ingest, который содержит процессор переименования в сочетании с Reindex API.
PUT _ingest/pipeline/my_rename_pipeline
{
"description" : "describe pipeline",
"processors" : [
{
"rename": {
"field": "fieldCamelcase",
"target_field": "fieldCamelCase"
}
}
]
}
POST _reindex
{
"source": {
"index": "source"
},
"dest": {
"index": "dest",
"pipeline": "my_rename_pipeline"
}
}
Обратите внимание, что вам нужно запустить Elasticsearch 5.x, чтобы использовать ingest. Если вы используете < 5.x, то вам придется пойти на то, что @Val упомянул в своем комментарии:)
Обновление имени поля в эластичной версии> 5 (отсутствующее было удалено) с помощью API _update_by_query:
Пример:POST http: // localhost:9200 / INDEX_NAME / _update_by_query
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "NEW_FIELD_NAME"
}
}
}
},
"script" : {
"inline": "ctx._source.NEW_FIELD_NAME = ctx._source.OLD_FIELD_NAME; ctx._source.remove(\"OLD_FIELD_NAME\");"
}
}
Прежде всего, вы должны понимать, как elasticsearch и lucene хранят данные с помощью неизменяемых сегментов (вы можете легко прочитать об этом в Интернете).
Таким образом, любое решение удалит / создаст документы и изменит сопоставление или создаст новый индекс, а также новое сопоставление.
Самый простой способ - использовать update by query
API: https://www.elastic.co/guide/en/elasticsearch/reference/2.4/docs-update-by-query.html
POST /XXXX/_update_by_query
{
"query": {
"missing": {
"field": "fieldCamelCase"
}
},
"script" : {
"inline": "ctx._source.fieldCamelCase = ctx._source.fieldCamelcase; ctx._source.remove(\"fieldCamelcase\");"
}
}
Начиная с ES 6.4, вы можете использовать " Псевдонимы полей", которые обеспечивают функциональность, которую вы ищете, с почти 0 работой или ресурсами.
Обратите внимание, что псевдонимы можно использовать только для поиска, но не для индексации новых документов.