es-collapse字段折叠去重查询

es-collapse字段折叠去重查询

一、top_hits + 聚合统计agg

GET example/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
             "target_id": "14016237"
          }
        }
      ]
    }
  },
  "_source": [
    "id",
    "title"
  ],
  "aggs": {
    "phone_count": {
      "terms": {
        "field": "user_id"
      }
    }
  }
}

从查询结果中摘取一部分:

{
    "aggregations": {
        "phone_count": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": 20073846,
                    "doc_count": 2
                },
                {
                    "key": 20036806,
                    "doc_count": 1
                },
                {
                    "key": 23001854,
                    "doc_count": 1
                },
                {
                    "key": 23004000,
                    "doc_count": 1
                }
            ]
        }
    }
}

二、es5以后的新特性collapse(字段折叠)

查询语句参考:

GET example/_search
{
  "query": {
    "bool": {
      "must": [],
      "filter": [
        {
          "term": {
            "target_id": "14016237"
          }
        }
      ]
    }
  },
  "_source": [
    "id",
    "user_id",
    "expend_type",
    "@timestamp"
  ],
  "size": "15",
  "collapse": {
    "field": "user_id",      //按user_id字段进行折叠
    "inner_hits": {
        "name": "expend_list",   //查看用户信息结果键名
        "size":1,                //每个折合集文档数
        "sort":[{"id":"asc"}]    //每个折合集文档排序规则           "_source": []            //文档的字段
     }
  },
  "sort":[{"id":"desc"}]
}

说明:inner_hits是用于针对折叠字段(这里是user_id重复的数据)筛选排序而指定的规则,其中:name相当于别名,size是返回的折叠集结果数量,sort是针对user_id重复的数据根据指定规则来进行排序。
从查询结果中摘取一部分:

{
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 15,
    "successful" : 15,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 6,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {            ...
        "inner_hits" : {
          "expend_list" : {
            "hits" : {
              "total" : {
                "value" : 2,
                "relation" : "eq"
              },
              "max_score" : null,
              "hits" : [
                {
                  "_index" : "example",
                  "_type" : "_doc",
                  "_id" : "7840914",
                  "_score" : null,
                  "_source" : {
                    "target_id" : 14016237,
                    "user_id" : 20073846,
                    "id" : 7840914,
                    "time" : 1673493919
                  },
                  "sort" : [
                    7840914
                  ]
                },
                {
                  "_index" : "example",
                  "_type" : "_doc",
                  "_id" : "7840916",
                  "_score" : null,
                  "_source" : {
                    "id" : 7840916, 67,
                    "time" : 1673494355,
                    "user_id" : 20073846,
                    "target_id" : 14016237
                  },
                  "sort" : [
                    7840916
                  ]
                }
              ]
            }
          }
        }
      }          ...
    ]
  }
}

三、总结

collapse 允许基于字段对结果进行折叠。折叠操作是通过每个选择每个折叠键的顶部文档(top hits)来实现的。
不需要每次都在完整的结果集上对为每个折叠主键计算实际的 doc values 值,只对 top hits 这小部分数据操作就可以,因此和 term agg 相比要节省很多内存。

使用collapse注意事项:
1)响应结果中的hits总数表示匹配的文档总数而不是折叠的,去重后的聚合总数是未知的。
2)用于折叠的字段必须是单值的keyword或numeric字段并开启doc_values(文档值)。

评论

暂无

添加新评论