(九)elasticsearch之分组去重(collapse) |
您所在的位置:网站首页 › es的分页 › (九)elasticsearch之分组去重(collapse) |
一、背景介绍
问题一:如何对elasticsearch的检索结果进行去重统计计数。类似mysql 的 select count(*) from a group by b。 问题二:如何对elasticsearch的检索结果去重后显示。类似mysql 的select distint(“name”) from a group by b。 二、分析问题一: 统计计数需要借助elasticsearch聚合功能结合cardinality实现。 问题二: 方式一:使用字段聚合+top_hots聚合方式。 方式二:使用collapse折叠功能。 三、DSL 实例问题一: // 统计去重数目 GET user/_search { "size":0, "aggs" : { "name_count" : { "cardinality" : { "field" : "name" } } } }问题二: 方式一:top_hits 聚合 GET user/_search { "query": { "match_all": { } }, "aggs": { "type": { "terms": { "field": "name", "size": 10 }, "aggs": { "title_top": { "top_hits": { "_source": { "includes": [ "name" ] }, "sort": [ { "name": { "order": "desc" } } ], "size": 1 } } } } }, "size": 0 }方式二:使用 collapse 折叠 GET user/_search { "query": { "match_all":{} }, "collapse": { "field": "name" } }总结:collapse 折叠比聚合更加简洁,性能也更加优异。 四、collapse(折叠)介绍1、Field Collapsing(字段折叠)不能与scroll、rescore以及search after 结合使用。 2、使用collapse 的字段如果是 string类型,则es 中对应 keyword。(The field used for collapsing must be a single valued keyword or numeric field with doc_values activated) 3、查看collapse 结果 (1)GET user/_search { "query": { "match": { "address": "Place" } }, "collapse" : { "field" : "age" }, "sort": ["age"], "from": 10 } (2)Expand collapse results(对于每个折叠的结果,可以通过inner_hits展开结果) // 单个inner_hits GET user/_search { "query": { "match": { "address": "Place" } }, "collapse" : { "field" : "age", "inner_hits": { "name": "test", "size": 5, "sort": [{ "age": "asc" }] }, "max_concurrent_group_searches": 4 }, "sort": ["age"] } // 多个inner_hits GET user/_search { "query": { "match": { "address": "Place" } }, "collapse" : { "field" : "age", "inner_hits":[ { "name": "age", "size": 2, "sort": [{ "age": "asc" }] }, { "name":"account_number", "size": 2, "sort": [{ "account_number": "asc" }] }], "max_concurrent_group_searches": 4 }, "sort": ["age"] } // max_concurrent_group_searches:允许每组检索inner_hits的并发请求数 (默认按照线程池的大小或者数据节点数) |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |