2017-11-22 14 views
0

elasticsearchの私のドキュメントの1つです日付:ElasticSearch:スクリプトのインライン減算はここ

{ 
      "_index": "2017-10-21", 
      "_type": "cat", 
      "_id": "14", 
      "_score": 2.2335923, 
      "_source": { 
       "name": "Biscuit", 
       "breed": "Persian", 
       "age": "3", 
       "purchase_date": "2017-11-11T10:16:18+0100", 
       "birth_date": "2017-01-21T10:16:18+0100" 
      } 
} 

私は数分または数日間のために(それらを差し引いて)「PURCHASE_DATE」と「Birth_Dateの」の間の時間を計算したいと思います新しいフィールド 'age_when_bought'をこの時間に追加します(品種が "ペルシア語"のすべてのドキュメントで、ここではその点は重要ではありません)。

POST /*/_update_by_query 

{ 
    "script" : { 
     "inline": "ctx._source.age_when_bought = ctx._source.purchase_date - ctx._source.birth_date" 
    }, 
    "query": { 
     "bool": { 
      "must": [ 
      { 
       "match": { 
       "breed": "Persian" 
       } 
      } 
      ] 
     } 
    } 
} 

残念ながら、このようには機能しません。私はすでに日付にこれらのフィールドを変換することを試みたが、私はそれを行うには良い機能を使用しない場合があります

"caused_by": { 
      "type": "class_cast_exception", 
      "reason": "Cannot apply [-] operation to types [java.lang.String] and [java.lang.String]." 
     } 

:私はその応答でエラー500を持っている

'SimpleDateFormat.parse(ctx._source.purchase_date)' 

、私はまだエラーが発生しています今度はその応答を持つ500:

"caused_by": { 
      "type": "illegal_argument_exception", 
      "reason": "Unknown call [parse] with [1] arguments on type [SimpleDateFormat]." 
     } 

ありがとうございます!

答えて

0

私は最終的に解決策を見つけました!

POST /*/_update_by_query 

{ 
    "script" : { 
     "inline": "ctx._source.age_when_bought = (new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:sszzz\").parse(ctx._source.purchase_date).getTime() 
- new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:sszzz\").parse(ctx._source.birth_date).getTime()) 
    }, 
    "query": { 
     "bool": { 
      "must": [ 
      { 
       "match": { 
       "breed": "Persian" 
       } 
      } 
      ] 
     } 
    } 
} 

SimpleDateFormatは、日付の書式設定と解析をロケールに応じて行うためのクラスです。書式設定(日付→テキスト)、解析(テキスト→日付)、正規化が可能です。

Date.getTime()メソッドは、1970年1月1日00:00:00 GMTから経過したミリ秒数を返します。

date_1.getTime() - date_2.getTime()を実行すると、date_1とdate_2の間の時間がミリ秒単位で計算されます(date_1が現在の日付からdate_2に近い場合、結果は同じではありません)。

関連する問題