2017-06-06 5 views
0

ElasticSearch script_fieldsの出力を使用してインデックス内の別の変数を更新する方法はありますか?Elasticsearch script_fieldsは別のフィールドを更新しますか?

タイムスタンプが有効になっていても保存されていないElasticSearch 1.xにインデックスがあります。私は、このタイムスタンプフィールドを抽出し、インデックスに保存する必要がある

GET twitter/_search 
{ 
    "script_fields": { 
     "script1": { 
      "script": "_fields['_timestamp']" 
     } 
    } 
} 

- これはタイムスタンプが検索にアクセスし、またはのようなscript_fieldsを使用することができることを意味し

(マッピングについては以下を参照してください)。他のフィールドをコピーするスクリプトを書くのは簡単です。

ctx._source.t1=ctx._source.message 

(私は更新APIを使用しています)しかし、どのように私は、インデックス内の別のフィールドを更新するためにscript_fields出力から値を使用できますか?フィールド 'tcopy'に各ドキュメントのタイムスタンプの値を取得します。

また、以下のようにjavaを使用して値を取得しようとしましたが、nullを返しました。

SearchResponse response = client.prepareSearch("twitter") 
       .setQuery(QueryBuilders.matchAllQuery()) 
       .addScriptField("test", "doc['_timestamp'].value") 
       .execute().actionGet(); 

あなたは二つの実験でこれを行うために必要なマッピング

{ 
     "mappings": { 
      "tweet": { 
       "_timestamp": { 
        "enabled": true, 
        "doc_values" : true 
       }, 
       "properties": { 
        "message": { 
         "type": "string" 
        }, 
        "user": { 
         "type": "string" 
        }, 
        "tcopy": { 
         "type": "long" 
        } 
       } 
      } 
      } 
    } 
+0

を更新するには、この値を使用するスクリプトでUpdateRequestBuilder使用することができます

SearchResponse response = client.prepareSearch("twitter2") .setQuery(QueryBuilders.matchAllQuery()) .addScriptField("test", "doc['_timestamp'].value") .execute().actionGet(); 

ようになり、あなたは以来_fields._timestamp' 'と' _timestamp'にアクセスすることはできませんそれは格納されず、代わりに 'doc._timestamp.value'を使用します。 – Val

+0

しかし、更新されたスクリプトは 'doc._timestamp.value'を使用することはできません。 – Val

答えて

1

  1. クエリを実行し、マッピングID <取得 - >タイムスタンプと
  2. を次に、タイムスタンプで一括更新を実行します
  3. ですから、例えば、このような elasticdumpを使用することができ、あなたの twitterインデックスからタイムスタンプデータを抽出する

{"_index":"twitter","_type":"tweet","_id":"1","_score":1,"fields":{"ts":[1496806671021]}} 
{"_index":"twitter","_type":"tweet","_id":"2","_score":1,"fields":{"ts":[1496807154630]}} 
{"_index":"twitter","_type":"tweet","_id":"3","_score":1,"fields":{"ts":[1496807161591]}} 

elasticdump \ 
    --input=http://localhost:9200/twitter \ 
    --output=$ \ 
    --searchBody '{"script_fields": {"ts": {"script": "doc._timestamp.value"}}}' > twitter.json 

これは、ファイルが生成されますが、以下の内容を持つtwitter.jsonと呼ばれますそのファイルを簡単に使用して文書を更新することができます。まずread.sh

#!/bin/sh 
while read LINE; do 
    INDEX=$(echo "${LINE}" | jq '._index' | sed "s/\"//g"); 
    TYPE=$(echo "${LINE}" | jq '._type' | sed "s/\"//g"); 
    ID=$(echo "${LINE}" | jq '._id' | sed "s/\"//g"); 
    TS=$(echo "${LINE}" | jq '.fields.ts[0]'); 
    curl -XPOST "http://localhost:9200/$INDEX/$TYPE/$ID/_update" -d "{\"doc\":{\"tcopy\":"$TS"}}" 
done 

という名前のシェルスクリプトを作成し、最後に、あなたがこのようにそれを実行することができます:スクリプトの実行が終了した後

./read.sh < twitter.json 

、あなたの文書は_timestamp値でtcopyフィールドを持つことになります。

+0

私の[PRがマージされたら](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/74)、これを簡単なLogstashパイプラインで簡単に実行できます。 – Val

+0

素晴らしいです、ありがとうございました!本当にこれを感謝します。私はそれを行うための別の方法を見つけました、それも投稿しています。 – user2689782

+0

クール、喜んで助けます:-) – Val

0

_timestampフィールドには、javaを使用してアクセスできます。次に、Update APIを使用して新しいフィールドを設定することができます。リクエストはその後、私はあなたのスクリプトのフィールドでインデックス

関連する問題