zoukankan      html  css  js  c++  java
  • 在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_hots聚合方式。 
    方式二:使用collapse折叠功能。

    4、DSL源码

    1)统计去重数目。

    GET books/_search
    {
    "size":0,
    "aggs" : {
    "books_count" : {
    "cardinality" : {
    "field" : "title.keyword"
    }
    }
    }
    }

    2)返回去重内容

    方式一:top_hits聚合

    GET books/_search
    {
    "query": {
    "match_all": {}
    },
    "aggs": {
    "type": {
    "terms": {
    "field": "title.keyword",
    "size": 10
    },
    "aggs": {
    "title_top": {
    "top_hits": {
    "_source": {
    "includes": ["title"]
    },
    "sort": [
    {
    "title.keyword": {
    "order": "desc"
    }
    }
    ],
    "size":1
    }
    }
    }
    }
    },
    "size": 0
    }

    方式二:折叠

    GET books/_search
    {
    "query": {
    "match_all":{}
    },
    "collapse": {
    "field": "title.keyword"
    }
    }

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

    5、注意事项&小结

    1、折叠功能ES5.3版本之后才发布的。 
    2、聚合&折叠只能针对keyword类型有效;

  • 相关阅读:
    debian 9 安装AMD驱动
    DDL、DML、DCL、DQL的理解
    呼叫中心坐席功能都有哪些?
    使用vi编辑器的问题
    百度聊天机器人UNIT http访问
    通过http方式 post天气,并合成语音
    单链表的基本操作
    pip下载慢解决(添加国内镜像)
    Anaconda+Tensorflow配置说明
    gdb的基本使用
  • 原文地址:https://www.cnblogs.com/pyspark/p/8817716.html
Copyright © 2011-2022 走看看