es 去重统计_es 去重查询(聚合、分组、分页、求和统计等)

本文介绍了如何在 Elasticsearch 中利用聚合功能实现字段去重、分组、分页及统计操作。通过示例展示了如何使用 terms 聚合获取不同字段值,如何实现去重后的分页,以及如何根据字段值进行排序和求和统计。
摘要由CSDN通过智能技术生成

elasticsearch(es) 如何针对指定字段进行去重相关查询,完成如聚合、分组、分页、类似求和统计等操作?

获取所有的不同值

es 获取指定字段所有可能的值,可以使用桶聚合的 terms 聚合,如下示例:

GET {index}/_search

{

"size": 0,

"aggs": {

"distinct_aggs": {

"terms": {

"field": "status"

}

}

}

}

如上示例,获取指定索引的 status 字段的不同值,size 字段设置为 0,表示搜索出来的文档数为 0 个,也表示不关心文档内容只要聚合结果。 如果为 1 ,就会搜索出 1 个文档。返回如下:

{

"took": 2,

"timed_out": false,

"_shards": {

"total": 3,

"successful": 3,

"skipped": 0,

"failed": 0

},

"hits": {

"total": 58439,

"max_score": 0,

"hits": []

},

"aggregations": {

"distinct_aggs": {

"doc_count_error_upper_bound": 0,

"sum_other_doc_count": 0,

"buckets": [

{

"key": 3,

"doc_count": 46619

},

{

"key": 2,

"doc_count": 11810

},

{

"key": 1,

"doc_count": 10

}

]

}

}

}

去重后分页

分页的话,肯定需要有排序规则,接着如上示例,增加的获取的条数参数 size 和 排序参数 order 即可:

GET {index}/_search

{

"size": 0,

"aggs": {

"distinct_aggs": {

"terms": {

"field": "item_id",

"size" : 1000,

"order": {

"_term": "asc"

}

}

}

}

}

输出如下:

{

"took": 1,

"timed_out": false,

"_shards": {

"total": 3,

"successful": 3,

"skipped": 0,

"failed": 0

},

"hits": {

"total": 58463,

"max_score": 0,

"hits": []

},

"aggregations": {

"distinct_aggs": {

"doc_count_error_upper_bound": 0,

"sum_other_doc_count": 0,

"buckets": [

{

"key": 1,

"doc_count": 32

},

{

"key": 2,

"doc_count": 11811

},

{

"key": 3,

"doc_count": 46620

},

...

]

}

}

}

聚合求和统计

聚合字段的排序,也可以通过指定字段的求和等计算统计结果后进行升降序排序,具体示例如下:

GET {index}/_search

{

"size": 0,

"aggs": {

"item_terms": {

"terms": {

"field": "item_id",

"size": 1000,

"order":[{

"gmv_stat": "desc"

},{

"gmv_180d": "desc"

}]

},

"aggs": {

"gmv_stat": {

"sum": {

"field": "gmv"

}

},

"gmv_180d": {

"sum": {

"script": "doc['gmv_90d'].value*2"

}

}

}

}

}

}

返回如下:

{

...

"aggregations": {

"item_terms": {

"doc_count_error_upper_bound": 0,

"sum_other_doc_count": 260,

"buckets": [

{

"key": 23388,

"doc_count": 18,

"gmv_stat": {

"value": 176220

},

"gmv_180d": {

"value": 89732

}

},

{

"key": 96117,

"doc_count": 16,

"gmv_stat": {

"value": 129306

},

"gmv_180d": {

"value": 56988

}

},

...

]

}

}

}

根据提供的引用内容,没有找到关于ES多线程分组分页查询的信息。不过,ES支持多线程查询分组分页查询,可以分别介绍一下。 1. ES多线程查询 ES支持多线程查询,可以通过设置线程池来控制并发查询的数量。以下是一个使用Python Elasticsearch库进行多线程查询的例子: ```python from elasticsearch import Elasticsearch from elasticsearch.helpers import parallel_bulk from multiprocessing import Pool es = Elasticsearch() def process_data(data): # 处理数据的函数 pass def index_data(data): # 索引数据的函数 pass def run_query(query): # 运行查询的函数 pass def run_parallel_bulk(data): with Pool(processes=4) as pool: for success, info in parallel_bulk(es, data, index='my-index', chunk_size=1000, thread_count=4): if not success: print('A document failed:', info) ``` 在上面的例子中,我们使用了Python的multiprocessing库来创建一个进程池,然后使用Elasticsearch的parallel_bulk函数来并发地索引数据。 2. ES分组分页查询 ES支持分组分页查询,可以使用Elasticsearch的search方法来实现。以下是一个使用Python Elasticsearch库进行分组分页查询的例子: ```python from elasticsearch import Elasticsearch es = Elasticsearch() def search_data(): query = { "size": 0, "aggs": { "group_by_field": { "terms": { "field": "my_field", "size": 10 }, "aggs": { "group_by_date": { "date_histogram": { "field": "my_date_field", "interval": "day" }, "aggs": { "sum_by_field": { "sum": { "field": "my_sum_field" } } } } } } } } res = es.search(index="my-index", body=query) return res ``` 在上面的例子中,我们使用了Elasticsearch的聚合功能来进行分组分页查询。我们首先按照my_field字段进行分组,然后按照my_date_field字段进行日期直方图聚合,最后对my_sum_field字段进行求和聚合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值