Elasticsearch桶联合

时间:2017-11-03 16:14:27

标签: elasticsearch

我有这个示例文档列表:

curl -XPOST 'localhost:9200/test_data/test_row/_bulk?pretty' -H 'Content-Type: application/json' -d'
{ "index": {}}
{ "value": 1, "user_id": 1, "profiler_id": 1}
{ "index": {}}
{ "value": 3, "user_id": 1, "profiler_id": 1}
{ "index": {}}
{ "value": 3, "user_id": 1, "profiler_id": 2}
{ "index": {}}
{ "value": 1, "user_id": 2, "profiler_id": 1}
{ "index": {}}
{ "value": 1, "user_id": 2, "profiler_id": 2}
{ "index": {}}
{ "value": 1, "user_id": 3, "profiler_id": 1}
{ "index": {}}
{ "value": 2, "user_id": 3, "profiler_id": 2}
{ "index": {}}
{ "value": 3, "user_id": 3, "profiler_id": 2}
{ "index": {}}
{ "value": 2, "user_id": 4, "profiler_id": 1}
{ "index": {}}
{ "value": 1, "user_id": 4, "profiler_id": 2}
{ "index": {}}
{ "value": 3, "user_id": 4, "profiler_id": 2}
'

我想计算所有回答了profiler_id = 1和value = 1 AND profiler_id = 2且值为1或2的用户。这意味着只有用户2和3符合两者的标准。

我知道如何对条款进行存储桶聚合并根据profiler_id对匹配文档进行计数,但是Elasticsearch中是否有办法计算一次匹配BOTH条件的用户?

{
  "query": {
    "bool": {
      "must": [],
      "must_not": [],
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "profiler_id": 1
                }
              },
              {
                "term": {
                  "value": 1
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "profiler_id": 2
                }
              },
              {
                "terms": {
                  "value": [
                    1,
                    2
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  },
  "size": 0,
  "aggs": {
    "genres": {
      "terms": {
        "field": "profiler_id"
      },
      "aggs": {
        "type_count": {
          "cardinality": {
            "field": "user_id"
          }
        }
      }
    }
  }
}

根据profiler_id分别给我计数,这不是我想要的。我不确定如何计算在两个存储桶中都有文档相交的用户。

2 个答案:

答案 0 :(得分:0)

您是否尝试计算符合这些条件的唯一用户数?如果是这样,您只需将should条款移至must参数(强制转换为AND)并在user_id字段上使用基数聚合

如果没有,你能举例说明你想要的输出吗?

答案 1 :(得分:0)

我寻找的解决方案需要索引用户对象,然后将其分析器索引为子文档。这样我就可以编写以下示例查询来获得我想要的结果:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "country": "US"
          }
        },
        {
          "term": {
            "gender": "m"
          }
        },
        {
          "range": {
            "date": {
              "gte": "2017-10-01"
            }
          }
        },
        {
          "range": {
            "date_of_birth": {
              "gte": "1987-11-09",
              "lte": "1999-11-09"
            }
          }
        },
        {
          "has_child": {
            "type": "user_profiler",
            "query": {
              "bool": {
                "must": [
                  {
                    "bool": {
                      "must": [
                        {
                          "term": {
                            "profiler_id": 6
                          }
                        },
                        {
                          "terms": {
                            "answer_value": [
                              3,4,5
                            ]
                          }
                        }
                      ]
                    }
                  }
                ],
                "must_not": [],
                "should": []
              }
            }
          }
        },
        {
          "has_child": {
            "type": "user_profiler",
            "query": {
              "bool": {
                "must": [
                  {
                    "bool": {
                      "must": [
                        {
                          "term": {
                            "profiler_id": 3
                          }
                        },
                        {
                          "terms": {
                            "answer": [
                              1
                            ]
                          }
                        }
                      ]
                    }
                  }
                ],
                "must_not": [],
                "should": []
              }
            }
          }
        }
      ],
      "must_not": [],
      "should": []
    }
}