2017-06-30 12 views
0

現在、我々は複数のリクエストでエラスティックを検索しています。elasticsearchとspringを通じたユニオン検索

データ "カロリー"、 "名前"、および "家族"を持つ果物のインデックスを持っている場合は、家族 "a"と一緒にトップ3(カロリーベース) 、トップ3は「b」、トップ3は「c」である。

現在、私のようなクエリを見ながら、3回の検索になります(上記のクエリがループになることなのでQueryBuilders.boolQuery().must(QueryBuilders.termQuery("family", "a"));

を使用して

{ 
    "sort": [ {"calories": "desc"} ], 
    "query": { 
    "bool" : { 
     "must": [ 
     {"term": { "family": "a" }} // second time "b", third time "c"... 
     ] 
    } 
    }, 
    "from": 0, 
    "size": 3 
} 

を、それが「B」の二番目の時間、私は何とかSQLからUNIONと同様の機能を行うことができれば三回目の「C」)

私の質問はありますか? 3つの結果を家族 "a"、3人を家族 "b"、3人を家族 "c"と結びつける。また、どのようにこれはJava(春のブート)で行われるだろう非常に役立つだろう!

ありがとうございます!説明/説明がうまくいかない場合は、教えてください、私は精緻化しようとします。

答えて

1

あなたはマルチ検索を実行し、JavaでUNIONを行うことができます(あなたが簡単に結果をランク付けすることができますので、これは良い方法です)。

または、句を実行するには、boolshouldというクエリを使用します。

"bool" : { 
     "should": [ 
     {"term": { "family": "a" }}, 
     {"term": { "family": "b" }}, 
     {"term": { "family": "c" }} 
     ] 
    } 

しかし、家族ごとの結果の数を制御するのは難しいです。

だから別の解決策は、用語凝集+ top_hitsを使用することである。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html

{ 
    "query": { 
     "match_all": {} 
    }, 
    "aggs": { 
     "family": { 
     "terms": { 
      "field": "family" 
     }, 
     "aggs": { 
      "top_sales_hits": { 
       "top_hits": { 
        "sort": [ 
        { 
         "date": { 
          "order": "desc" 
         } 
        } 
        ], 
        "_source": { 
        "includes": [ 
         "date", 
         "price" 
        ] 
        }, 
        "size": 10 
       } 
      } 
     } 
     } 
    } 
} 

注:これは単なる一例であり、ない作業溶液。

関連する問題