web-dev-qa-db-ja.com

Elastic Searchでネストされた配列を持つフィールドを更新する

ドキュメント内のフィールドを配列で更新しようとしています。フィールド「products」に配列を追加したい。私はこれを試しました:

POST /index/type/1/_update
{
    "doc" :{
       "products": [
         {
           "name": "A",
           "count": 1
         },
         {
           "name": "B",
           "count": 2
         },
         {
           "name": "c",
           "count": 3
         }
       ]
    }
}

これは、コードを実行しようとしたときに得られるエラー応答です。

{
   "error": {
      "root_cause": [
         {
            "type": "mapper_parsing_exception",
            "reason": "failed to parse [products]"
         }
      ],
      "type": "mapper_parsing_exception",
      "reason": "failed to parse [products]",
      "caused_by": {
         "type": "illegal_state_exception",
         "reason": "Can't get text on a START_OBJECT at 1:2073"
      }
   },
   "status": 400
}

誰が私が間違っているのか知っていますか?

14
user3407300

「START_OBJECTでテキストを取得できません」というメッセージは、Elasticsearchが「string」タイプのエントリを予期していたが、入力としてオブジェクトを与えようとしていることを意味します。

Kibanaをチェックすると、フィールド「products」がそこに存在し、文字列として定義されていることがわかります。ただし、辞書のリストを入力しているので、フィールド「製品」は最初からオブジェクトとして定義されている必要があります(動的フィールドが含まれていることが望ましい)。例は、 https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic.html にある完全な例を参照してください)

    "products": { 
      "dynamic": true,
      "properties": {}
    }

ただし、すでにインデックスがあるため、マッピングを変更できないため、インデックスを削除し、事前にマッピングを行ってから更新を行う必要があります。

19
mshabeeb