web-dev-qa-db-ja.com

Elasticsearchマッピング-既存のフィールドの名前を変更します

とにかく、新しい要素を追加せずに、既存のElasticsearchマッピングの要素の名前を変更できますか?もしそうなら、既存のマッピングを壊さないようにするためにそれを行うための最良の方法は何ですか?

例えばfieldCamelcaseからfieldCamelCaseへ

{
    "myType": {
        "properties": {
            "timestamp": {
                "type": "date",
                "format": "date_optional_time"
            },
            "fieldCamelcase": {
                "type": "string",
                "index": "not_analyzed"
            },
            "field_test": {
                "type": "double"
            }
        }
    }
}
7
e.f.a.

これを行うには、 Rename ProcessorReindex API と組み合わせて含む Ingest パイプラインを作成します。

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"
  }
} 

Ingestを使用するには、Elasticsearch5.xを実行している必要があることに注意してください。 <5.xを実行している場合は、@ Valがコメントで述べたことを実行する必要があります:)

11
Byron Voorbach

まず、elasticsearchluceneがデータを保存する方法を理解する必要があります。不変のセグメントによって(インターネットで簡単に読むことができます)。

したがって、どのソリューションでも、ドキュメントを削除/作成してマッピングを変更するか、新しいインデックスを作成して、新しいマッピングも作成します。

最も簡単な方法は、update by query AP​​Iを使用することです: 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\");"
    }
}
1
Thomas Decaux