2015-10-04 8 views
9

"url"(解析済み)と "respsize"(not_analyzed)フィールドのみを最初に含むドキュメントがあります。私は、URLに一致するドキュメントを更新し、新しいフィールド "カテゴリ"を追加したい 私は意味する;最初DOC1で :elasticsearchのクエリと一致する複数のドキュメントを更新するには

{ 
"url":"http://stackoverflow.com/users/4005632/mehmet-yener-yilmaz", 
"respsize":"500" 
} 

私は外部のデータを持っていると私は知っている「stackoverflow.com」は、カテゴリ10、 に属していると私は、ドキュメントを更新し、それを好きにする必要があります。

{ 
"url":"http://stackoverflow.com/users/4005632/mehmet-yener-yilmaz", 
"respsize":"500", 
"category":"10" 
} 

もちろん、私はフィールドをurlフィールドに "stackoverflow.com" と私は各文書olyを一度更新する必要がありますすべてのドキュメントを行う.. URLのカテゴリのデータは変更できないため、再度更新する必要はありません。 _update APIを使用して_version番号でチェックする必要がありますが、dslクエリを作成できません。私はこれを実行して見えます EDIT が正常に動作します: enter image description here しかし、文書が変更されません。.. enter image description here

クエリ結果が真に見えますが、新しいフィールドがドキュメントに追加されていない、などのリフレッシュまたは必要ですか?

答えて

20

これを行うには、update by query pluginを使用できます。考え方は、categoryがなく、urlが特定の文字列に一致するすべての文書を選択し、希望のカテゴリを追加することです。

curl -XPOST 'localhost:9200/webproxylog/_update_by_query' -d ' 
{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "url": "stackoverflow.com" 
       } 
      }, 
      { 
       "missing": { 
       "field": "category" 
       } 
      } 
      ] 
     } 
     } 
    } 
    }, 
    "script" : "ctx._source.category = \"10\";" 
}' 

これを実行した後、カテゴリを持たないurl: stackoverflow.comを持つすべてのドキュメントは、category: 10を取得します。その間に同じクエリを再度実行して、新しい文書stackoverflow.comを修正することができます。また

ES elasticsearch.ymlでスクリプトを有効にして再起動してください:あなたが望むように、あなたは、例えば、できるだけ多くのフィールドを追加することは自由ですスクリプトで

script.inline: on 
script.indexed: on 

... 
    "script" : "ctx._source.category1 = \"10\"; ctx._source.category2 = \"20\";" 

UPDATE

ES 2.3は今update by query機能を備えています。上記のクエリをそのまま使用することもできます(ただし、filteredmissingは非推奨ですが、それでも動作します)。

+1

update-by-query 'uron'ではなく' heroname'フィールドになければなりません。スクリーンショットはあなたの質問の最初の文書と共通するものはないようです。 – Val

+0

私はすでに申し訳ありませんが、 –

+0

はあなたの 'heroname'フィールドが分​​析されているかどうかを変更しますか?最上部の検索クエリに 'missing'フィルタを追加すると、何が得られますか? – Val

0

すごくいいですが、@Valの回答に追加するだけで、Update By QueryはElasticSearch 2.xの形式で利用できますが、以前のバージョンでは利用できません。ここでは従来の理由で1.4を使用していますので、将来的にアップグレードする機会はありません。別の解決方法では、ここで提供されているUpdate by Queryプラグインを使用しています。https://github.com/yakaz/elasticsearch-action-updatebyquery

関連する問題