2016-06-27 11 views
1

ドキュメントを更新する(リストに要素を追加する)か、存在しない場合は作成しています。たとえば、リストsuggestionsの要素をまだ追加していない場合は、id == Donald_Duckの文書にその要素を追加します。 Python APIを使用してElasticSearchドキュメントを条件付きで更新する

name = 'Donald_Duck' 
suggestions = ['Donald', 'Donald duck', 'Duck', 'Duck Avanger'] 
body = { 
      "script" : "ctx._source.text += new_suggetions", 
      "params" : { "new_suggestions" : suggestions}, 
      "upsert" : suggestions 
     } 


es.update(index=INDEX_NAME, doc_type='test', id=name, body=body) 

は、残念ながら私が取得 RequestError

RequestError: TransportError(400, 'mapper_parsing_exception', 'failed to parse') 

これは私のマッピングがどのように見えるかです:

mappings = { 
    "mappings": { 
    "test": { 
     "properties": { 
     "text": { 
        "type": "completion", 
        "analyzer" : "simple", 
        "search_analyzer" : "simple" 
     }, 
     } 
    } 
    } 
} 

がどのように私はこの問題を解決することができますか? 複数のドキュメントがある場合は、bulk APIで同じコードを使用できますか?

答えて

2

あなたはあなたの体のいくつかのタイプミスがあります。

body = { 
    "script": "ctx._source.text += new_suggestions", 
    "params": { "new_suggestions" : suggestions}, 
    "upsert": { 
     "text": suggestions 
    } 
} 

プラスは、あなたが更新のためにスクリプトを有効にしていることを確認しています。お読みくださいhttps://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html

+0

はい、スクリプトが既に有効になっています。 – meto

+0

あなたは 'text:suggestions'を意味すると思いますよね? – meto

+1

はい、確かに編集しました –

関連する問題