web-dev-qa-db-ja.com

Elasticsearchのネストされたタイプ:ドキュメントのインデックス作成時に「オブジェクトマッピングをネストから非ネストに変更することはできません」

次のように見えるElasticsearch(v2.3.1)マッピングにネストされたドキュメントのインデックスを作成しようとしています (ドキュメントのこの例に基づいて)

PUT /my_index
{
  "mappings": {
    "blogpost": {
      "properties": {
        "title": { "type": "string" },
        "comments": {
          "type": "nested", 
          "properties": {
            "name":    { "type": "string"  },
            "comment": { "type": "string"  }
          }
        }
      }
    }
  }
}

ただし、そのマッピングに適合するためにJSONドキュメントがどのように見える必要があるのか​​理解できません。私が試した

PUT /my_index/some_type/1
{
  "title": "some_title",
  "comments": {
    "name": "some_name",
    "comment": "some_comment"
  }
}

と同様に

PUT /my_index_some_type/1
{
  "title": "some_title",
  "comments": [
      {
        "name": "some_name",
        "comment": "some_comment"
      }
  ]
}

どちらも結果として

{

    "error": 

{

    "root_cause": 

[

            {
                "type": "remote_transport_exception",
                "reason": "[Caiman][172.18.0.4:9300][indices:data/write/index[p]]"
            }
        ],
        "type": "illegal_argument_exception",
        "reason": "object mapping [comments] can't be changed from nested to non-nested"
    },
    "status": ​400

}

ネストされたドキュメントにインデックスを付ける正しい形式はどれですか?作業例は大歓迎です。ここのSOまたは他のページにあるほとんどの例は、ドキュメントが以前にインデックス付けされた方法ではなく、ネストされたクエリに集中しています。

19
Dirk

タイプsome_typeのドキュメントを実際に作成しているようで、commentsは通常のobjectにデフォルト設定されます(つまり、nestedではありません)。同じインデックスのcommentsマッピングタイプのblogpostというネストされたオブジェクト。

代わりにこれを試してください、それは動作するはずです:

PUT /my_index/blogpost/1
{
  "title": "some_title",
  "comments": {
    "name": "some_name",
    "comment": "some_comment"
  }
}
18
Val