2016-09-27 5 views
0

私は非常に多くのレコードを持っているelasticsearchインデックスを持っています。そこフィールドのユーザー名は、である私は、カンマ区切り値を渡すことで、各ユーザ名の最新の1件の記事を取得したい、例::Elasticsearch 1つの一致するクエリの1つのレコード

ジョン、シャヒード、マイク、ジョリー

と私は、最新の1件の記事が欲しいです各ユーザー名のこれどうやってするの?私は一度に1つのユーザー名を渡すことによってそれを行うことができますが、それは非常に多くのHTTP要求を打つでしょう。私は1つの要求でそれをやりたい

答えて

0

あなたはあなたが必要なものを達成するために、top_hits 1と結合されたフィルタterms集約を使用することができます。

{ 
    "size": 0, 
    "query": { 
    "bool": { 
     "filter": { 
     "terms": { 
      "username": [ "john", "shahid", "mike", "jolie" ] 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "usernames": { 
     "filter": { 
     "terms": { 
      "username": [ "john", "shahid", "mike", "jolie" ] 
     } 
     }, 
     "aggs": { 
     "by_username": { 
      "terms": { 
      "field": "username" 
      }, 
      "aggs": { 
      "top1": { 
       "top_hits": { 
       "size": 1, 
       "sort" : {"created_date" : "desc"} 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

このクエリはほとんど私の要件に近いですが、これは各ユーザー名の最も古いレコードを与えています。私は最新のレコードが必要です。 created_dateの降順でソートするには? –

+0

私は自分の答えを更新しました。 – Val

+0

今はすべてがうまくいきます。私はboolだけを変更しました ":{" filter ":{bool": "must":[{"query_string":{ –

0

このクエリは、post_dateで降順でソートされたこれらの4つのIDのすべての投稿を表示します。そのデータを処理して結果を得ることができます。

{ 
     "sort" : [ 
     { "post_date" : {"order" : "desc"}} 
     ], 
     "query" : { 
     "filtered" : { 
      "filter" : { 
      "terms" : { 
       "username" : ["john","shahid","mike","jolie] 
      } 
      } 
     } 
     } 
    } 
+0

このクエリは、他のユーザーのために、「マイク」が、レコードなしのための20回の記録を与えています、私は4つのユーザー名があるので、4人のレコードしか必要としません。ユーザーごとに1つのレコードです。 –

関連する問題