具有多个字段的弹性搜索基数聚合

时间:2019-01-16 13:50:32

标签: elasticsearch

以下是我的测试数据索引中的记录,并使用弹性搜索5.6版。

[
  {
    "_index": "test-data",
    "_type": "log",
    "_id": "123",
    "_score": 2,
    "_source": {
      "request": "/test-url/poll?request_ids=1",
      "user": "test1"
    }
  },
  {
    "_index": "test-data",
    "_type": "log",
    "_id": "126",
    "_score": 2,
    "_source": {
      "request": "/test-url/poll?request_ids=2",
      "user": "test1"
    }
  },
  {
    "_index": "test-data",
    "_type": "log",
    "_id": "124",
    "_score": 2,
    "_source": {
      "request": "/test-url/poll?request_ids=2",
      "user": "test1"
    }
  },
  {
    "_index": "test-data",
    "_type": "log",
    "_id": "125",
    "_score": 2,
    "_source": {
      "request": "/test-url/poll?request_ids=2",
      "user": "test1"
    }
  },
  {
    "_index": "test-data",
    "_type": "log",
    "_id": "128",
    "_score": 2,
    "_source": {
      "request": "/test-url/poll?request_ids=2",
      "user": "test2"
    }
  }
]

我需要找到具有请求和用户的唯一组合的不同记录的数量,并尝试以下查询。我期望结果为3,但得到5。

{
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "request"
          }
        },
        {
          "regexp": {
            "request.keyword": "/test-url/poll\\?request_ids=.*"
          }
        }
      ]
    }
  },
  "_source": ["request.keyword", "user.keyword","request", "user"], 
  "aggs": {
    "request_count": {
          "cardinality": {
            "script": {
              "lang": "painless", 
              "source": "[doc['request.keyword'], doc['user.keyword']]"
            }
          }
        }
  }
}

有人可以提出查询问题或解决此问题的其他选项吗?

1 个答案:

答案 0 :(得分:0)

我认为您应该尝试以下操作:

“[doc['request.keyword'].value + ' ' + doc['user.keyword']].value”

这将计算该字段的哈希,该哈希将是两个值(请求和用户)的连接字符串

注意-这将对性能产生重大影响,因为它是即时计算和提取字段值的

避免这种情况的一种可能是更改索引过程以将这个合成字段创建为串联,因此以后您可以使用常规基数聚合,而不是脚本聚合。