Elasticsearch6 去重

Elasticsearch6.X 去重

1、题记

Elasticsearch有没有类似mysql的distinct的去重功能呢?

1)如何去重计数?
类似mysql: select distinct(count(1)) from my_table;
2)如何获取去重结果。
类似mysql:SELECT DISTINCT name,age FROM users;

2、需求

1)对ES的检索结果进行去重统计计数。
2)对ES的检索结果去重后显示。

3、分析

1)统计计数需要借助ES聚合功能结合cardinality实现。
2)去重显示结果有两种方式:
方式一:使用字段聚合+top_hits聚合方式。
方式二:使用collapse折叠功能。

4、DSL源码

1)统计去重数目。

 1GET books/_search
 2{
 3"size":0,
 4"aggs" : {
 5"books_count" : {
 6"cardinality" : {
 7"field" : "title.keyword"
 8}
 9}
10}
11}

2)返回去重内容

方式一:top_hits聚合

 1GET books/_search
 2{
 3"query": {
 4"match_all": {}
 5},
 6"aggs": {
 7"type": {
 8"terms": {
 9"field": "title.keyword",
10"size": 10
11},
12"aggs": {
13"title_top": {
14"top_hits": {
15"_source": {
16"includes": ["title"]
17},
18"sort": [
19{
20"title.keyword": {
21"order": "desc"
22}
23}
24],
25"size":1
26}
27}
28}
29}
30},
31"size": 0
32}

方式二:折叠

1GET books/_search
2{
3"query": {
4"match_all":{}
5},
6"collapse": {
7"field": "title.keyword"
8}
9}

方式二较方式一:
1)简化;
2)性能比aggs的实现要好很多。
更多DSL详见:http://t.cn/RmafXMJ

5、注意事项&小结

import datetime
import json

from elasticsearch import Elasticsearch

es = Elasticsearch(['192.168.0.0:9200'])
source_arr = ["fileName","flag"]

def query_param():
    time1=datetime.datetime.now()
    res = es.search(index="ccat1",doc_type='demo0',from_=0,size=100000,
                    body={
                        "collapse": {
                            "field": "fileName.keyword"
                        },
                        "_source": source_arr,"query":  {"bool": {
       "must": [
           # {"match": {"captureInfo.currentDistinguishNum": 0}},
           {"range": {
                   "photo.capturenum": {
                       "gte":0,
                       "lte": 1
                   }
               }
           },
           {"range": {
               "ymdh": {
                   "gte": 2018072400,
                   "lte": 2018072402
               }
           }
           }
       ]}
       }})
    # query = {'query': {'match_all': {}}}# 查找所有文档
    print(len(res["hits"]["hits"]))
    for data in res["hits"]["hits"]:
        pass
        # print("http://192.168.0.100:",data["_source"]["uri"])

if __name__ == '__main__':
    query_param()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI视觉网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值