ElasticSearch查询以查找两个查询的交集

时间:2017-03-22 06:11:01

标签: elasticsearch

记录以这种格式存在:{user_id, state}

我需要编写一个elasticsearch查询来查找记录列表中同时存在这两种状态的所有user_id。

例如,如果存储的样本记录是:

{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 个答案:

答案 0 :(得分: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"
          }
        }
      }
    }
  }
}