2016-08-17 21 views
5

私のprevious questionでは、query_stringというクエリでfieldsに紹介されました。また、ドキュメントのネストされたフィールドを検索するのに役立ちます。Elasticsearchの同じクエリで `gt`と` fields`を使用する方法

{ 
    "query": { 
    "query_string": { 
     "fields": ["*.id","id"], 
     "query": "2" 
    } 
    } 
} 

しかし、それはマッチングのためだけに機能しますが、何か比較したいのですが?いくつかの読み取りとテストの後、rangeのようなクエリはfieldsをサポートしていないようです。 rangeというクエリを実行する方法はありますか?ドキュメント階層のどこにでも散らばることができるフィールド上の日付ですなわち、次の文書考慮

{ 
    "id" : 1, 
    "Comment" : "Comment 1", 
    "date" : "2016-08-16T15:22:36.967489", 
    "Reply" : [ { 
     "id" : 2, 
     "Comment" : "Inner comment", 
     "date" : "2016-08-16T16:22:36.967489" 
    } ] 
} 

は、明示的にReply.dateにアドレスを与えることなく、ためにネストされたフィールドを、与えられた文書と一致する(date > '2016-08-16T16:00:00.000000'のような)dateフィールド上で検索クエリがありますか?この(私は次のクエリが間違っている知っている)ような何か:

{ 
    "query": { 
     "range" : { 
      "date" : { 
       "gte" : "2016-08-16T16:00:00.000000", 
      }, 
      "fields": ["date", "*.date"] 
     } 
    } 
} 

答えて

3

自身がそれをサポートしていないrangeクエリは、しかし、あなたは(再び)query_stringクエリを活用することができますし、フィールドをワイルドカードことができるという事実と、それはあなたが必要なものを達成するために範囲クエリをサポートしていること:

{ 
    "query": { 
    "query_string": { 
     "query": "\*date:[2016-08-16T16:00:00.000Z TO *]" 
    } 
    } 
} 

Reply.date試合*date

+0

あなたが説明/ Wにドキュメントを参照してください可能性があるため、上記のクエリは、あなたの文書を返します。 '\ *'がやっている帽子?そして私は以前のように 'fields'を使うべきですか? – Mehran

+2

「[クエリ文字列クエリの構文]」(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-query.html#_field_names)ドキュメントの[フィールド名前 "セクション。 'fields'を使う必要はありません。ワイルドカードは不要です。 '\ * date'は' date'で終わるフィールド(ネストされたフィールドを含む)を意味します。バックスラッシュがあるのは、クエリ文字列の構文で予約文字であるワイルドカード '*'をエスケープする必要があるためです。 – Val

関連する問題