2017-05-02 29 views
1

私はElasticSearchでインデックス/検索したいドキュメントがあります。これらの文書には複数の日付が含まれている場合があり、場合によっては日付が実際の日付範囲になる場合もあります。私は誰かが私が正しいことをするクエリを書く方法(または私がそれを照会することができるように私のドキュメントを適切にインデックスする方法)を理解するのに役立つかどうか疑問に思っています。ElasticSearchで日付範囲をインデックスする方法

例は1000語に相当します。ドキュメントに2つの結婚の日付範囲が含まれているとします(2005-05-05〜2007-07-07および2012-12-012〜2014-03-03)。

開始日と終了日のフィールドに各日付範囲をインデックスし、典型的な範囲クエリを書き込むと、1つの結婚が不等式の1つを満たし、もう1つが不等式を満たすため、2008-01-01の検索でこのレコードが返されます。もう一方を満足させる。 ESに2つの日付範囲を分ける方法を知りません。明らかに、marriage1とmarriage2フィールドを持つとこの問題は解決しますが、私の実際のデータセットでは無制限の日付があります。

私は、この問題を解決すると思われるdate_rangeデータ型をサポートしていますが、AWSの管理対象ESを使用しているため、5.1で固まっています。

ありがとうございます。

+0

おそらく、2つのフィールドstart_dateとend_dateを持つ 'nested'フィールドでしょう。あなたはすでにこのオプションを探検しましたか? –

+0

いいえ、私はESには本当に新しく、ネストされたフィールドに慣れていません。私はそのような構造があるのだろうかと思っていましたが、私が読んだ文書の中で何も実行していませんでした。私はそれを掘り下げます。その方向で私を指してくれてありがとう! –

答えて

0

この目的でnested objectsを使用できます。

PUT /records 
{ 
    "mappings": { 
    "record": { 
     "properties": { 
     "marriage": { 
      "type": "nested", 
      "properties": { 
      "start": { "type": "date" }, 
      "end": { "type": "date" }, 
      "person1":  { "type": "string" }, 
      "person2": { "type": "string" } 
      } 
     } 
     } 
    } 
    } 
} 

PUT /records/record/1 

{ 
    "marriage": [ { "start" : "2005-05-05","end" :"2007-07-07" , "person1" : "","person2" :"" },{"start": "2012-12-12","end": "2014-03-03","person1" : "","person2" :"" }] 
} 

POST /records/record/_search 
{ 
    "query": { 

      "nested": { 
      "path": "marriage", 
      "query": { 

        "range": { 
         "marriage.start": { "gte": "2008-01-01", "lte": "2015-02-03"} 
        } 

      } 
      } 

} 
+0

dateがmarriage.startとmarriage.endの間にあったドキュメントを見つけるクエリを取得するのはややこしいですが、ネストされた型はそれを可能にしました。ありがとう。 –

+0

@RobertWilleあなたのためにうまくいったクエリを投稿できますか? – Nick

関連する問題