2017-03-22 9 views
1

レコードは{user_id, state}の形式で存在します。ElasticSearch 2つのクエリの交差を見つけるためのクエリ

私は、両方の状態をレコードリストに持つすべてのuser_idを見つけるためにelasticsearchクエリを書く必要があります。サンプルレコードが保存されている場合たとえば

は、以下のとおりです。

{1,a} 
{1,b} 
{2,a} 
{2,b} 
{1,a} 
{3,b} 
{3,b} 

は、この例のクエリを実行しているからの出力は、私がこれまでに試した

{"1", "2"} 

次のようになります。

{ 
    "size": 0, 
    "query": { 
    "bool": { 
     "filter": { 
     "terms": { 
      "state": [ 
      "a", 
      "b" 
      ] 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "user_id_intersection": { 
     "terms": { 
     "field": "user_id", 
     "min_doc_count": 2, 
     "size": 100 
     } 
    } 
    } 
} 

これは返されます

{"1", "2", "3"} 
+1

? – mirzak

+0

は両方の状態のリストが前に定義されていますか?はいの場合は、状態Aと状態Bに対してANDとしてクエリを実行してから、unique修飾子を使用してuser_idのファセットをカウントします。 – Mysterion

+0

@mirzakこれまでに試したことを示すために質問を編集しました。 – hisna

答えて

0

ここ2、あなたは状態のカーディナリティが設定知っていると仮定すると、あなたは使用することができ、あなたがこれまでに試してみました何 Bucket Selector Aggregation

GET test/_search 
 
{ 
 
    "size": 0, 
 
    "aggs": { 
 
    "user_ids": { 
 
     "terms": { 
 
     "field": "user_id" 
 
     }, 
 
     "aggs": { 
 
     "states_card": { 
 
      "cardinality": { 
 
      "field": "state" 
 
      } 
 
     }, 
 
     "state_filter": { 
 
      "bucket_selector": { 
 
      "buckets_path": { 
 
       "states_card": "states_card" 
 
      }, 
 
      "script": "params.states_card == 2" 
 
      } 
 
     } 
 
     } 
 
    } 
 
    } 
 
}

関連する問題