ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步

这篇具有很好参考价值的文章主要介绍了ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据聚合

一、聚合的种类

官方文档 => 聚合 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html
聚合:对文档信息的统计、分类、运算。类似mysql sum、avg、count

  • 桶(Bucket)聚合:用来对文档做分组
    • TermAggregation:按照文档字段值分组(相当于mysql group by)
    • Date Histogram:按照日期阶梯分组,例如一周一组,一月一组
  • 度量(metric)聚合:用来计算一些值,最大值、平均值、最小值等。
    • Avg:平均值
    • Max:最大值
    • Min:最小值
    • Stats:同时求max、min、avg、sum等
  • 管道(pipeline)聚合:以其他聚合结果为基础继续做集合

二、DSL实现聚合

1、Bucket(桶)聚合

ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java

_count:默认是按照文档数量的降序排序

GET /hotel/_search
{
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 20,
        "order": {
          "_count": "asc"
        }
      }
    }
  }
}

上面使用的bucket聚合,会扫描索引库所有的文档进行聚合。可以限制扫描的范围:利用query条件即可。

GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "lt": 200 # 只对价位低于200的聚合
      }
    }
  }, 
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 20,
        "order": {
          "_count": "asc"
        }
      }
    }
  }
}

2、Metrics(度量)聚合

ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java

聚合的嵌套,先对外层进行聚合,在对内存进行聚合
注意嵌套查询:写在外层查询括号内,而非并立。

GET /hotel/_search
{
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 10,
        "order": {
          "scoreAgg.avg": "asc"
        }
      },
      "aggs": {
        "scoreAgg": {
          "stats": {
            "field": "score"
          }
        }
      }
    }
  }
}

三、RestAPI实现聚合

ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java

bucket trem聚合(group by),实现品牌、星级、城市聚合的方法

    public Map<String, List<String>> filters(RequestParam requestParam) {
        String[] aggNames = new String[]{"brand","city","starName"};
        Map<String, List<String>> resultMap = new HashMap<>();

        SearchRequest searchRequest = new SearchRequest("hotel");

        // 限定聚合范围
        BoolQueryBuilder boolQueryBuilder = getBoolQueryBuilder(requestParam);
        searchRequest.source().query(boolQueryBuilder);

        // 聚合字段
        searchRequest.source().size(0);
        searchRequest.source().aggregation(AggregationBuilders.terms(aggNames[0]).field("brand").size(100));
        searchRequest.source().aggregation(AggregationBuilders.terms(aggNames[1]).field("city").size(100));
        searchRequest.source().aggregation(AggregationBuilders.terms(aggNames[2]).field("starName").size(100));

        try {
            SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            Aggregations aggregations = searchResponse.getAggregations();

            for (String aggName : aggNames) {
                Terms terms =  aggregations.get(aggName);
                List<String> list = new ArrayList<>();
                for (Terms.Bucket bucket : terms.getBuckets()) {
                    list.add(bucket.getKeyAsString());
                }
                resultMap.put(aggName,list);
            }
            return resultMap;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

自动补全

一、拼音分词器

ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java

下载拼音分词器:https://github.com/medcl/elasticsearch-analysis-pinyin/releases/tag/v8.6.0
解压放在plugins目录下(docker挂载的目录),然后重启es
ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java

二、自定义分词器

ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java
ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java

拼音分词器的过滤规则,参照上面下载的链接。
ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java

创建一个自定义分词器(text index库),分词器名:my_analyzer

// 自定义拼音分词器 + mapping约束
PUT /test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "ik_max_word",
          "filter": "py"
        }
      },
      "filter": {
        "py": {
          "type": "pinyin",
          "keep_full_pinyin": false,
          "keep_joined_full_pinyin": true,
          "keep_original": true,
          "limit_first_letter_length": 16,
          "remove_duplicated_term": true,
          "none_chinese_pinyin_tokenize": false
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "my_analyzer",
        "search_analyzer": "ik_smart"
      }
    }
  }
}

ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java

三、自动补全查询

completion suggester查询:

  • 字段类型必须是completion
  • 字段值是多词条的数组才有意义

ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java

// 自动补全的索引库
PUT test2
{
  "mappings": {
    "properties": {
      "title":{
        "type": "completion"
      }
    }
  }
}
// 示例数据
POST test2/_doc
{
  "title": ["Sony", "WH-1000XM3"]
}
POST test2/_doc
{
  "title": ["SK-II", "PITERA"]
}
POST test2/_doc
{
  "title": ["Nintendo", "switch"]
}


// 自动补全查询
POST /test2/_search
{
  "suggest": {
    "title_suggest": {
      "text": "s", // 关键字
      "completion": {
        "field": "title", // 补全字段
        "skip_duplicates": true, // 跳过重复的
        "size": 10 // 获取前10条结果
      }
    }
  }
}

四、实现搜索款自动补全(例酒店信息)

ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java在这里插入代码片

构建索引库

// 酒店数据索引库
PUT /hotel
{
  "settings": {
    "analysis": {
      "analyzer": {
        "text_anlyzer": {
          "tokenizer": "ik_max_word",
          "filter": "py"
        },
        "completion_analyzer": {
          "tokenizer": "keyword",
          "filter": "py"
        }
      },
      "filter": {
        "py": {
          "type": "pinyin",
          "keep_full_pinyin": false,
          "keep_joined_full_pinyin": true,
          "keep_original": true,
          "limit_first_letter_length": 16,
          "remove_duplicated_term": true,
          "none_chinese_pinyin_tokenize": false
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "id":{
        "type": "keyword"
      },
      "name":{
        "type": "text",
        "analyzer": "text_anlyzer",
        "search_analyzer": "ik_smart",
        "copy_to": "all"
      },
      "address":{
        "type": "keyword",
        "index": false
      },
      "price":{
        "type": "integer"
      },
      "score":{
        "type": "integer"
      },
      "brand":{
        "type": "keyword",
        "copy_to": "all"
      },
      "city":{
        "type": "keyword"
      },
      "starName":{
        "type": "keyword"
      },
      "business":{
        "type": "keyword",
        "copy_to": "all"
      },
      "location":{
        "type": "geo_point"
      },
      "pic":{
        "type": "keyword",
        "index": false
      },
      "all":{
        "type": "text",
        "analyzer": "text_anlyzer",
        "search_analyzer": "ik_smart"
      },
      "suggestion":{
          "type": "completion",
          "analyzer": "completion_analyzer"
      }
    }
  }
}

查询测试

GET /hotel/_search
{
  "query": {"match_all": {}}
}

GET /hotel/_search
{
  "suggest": {
    "YOUR_SUGGESTION": {
      "text": "s",
      "completion": {
        "field": "suggestion",
        "skip_duplicates": true // 跳过重复的
      }
    }
  }
}

ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java
ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java

    public List<String> getSuggestion(String prefix) {
        SearchRequest request = new SearchRequest("hotel");
        ArrayList<String> list = new ArrayList<>();
        try {

            request.source().suggest(new SuggestBuilder().addSuggestion(
                    "OneSuggestion",
                    SuggestBuilders
                            .completionSuggestion("suggestion")
                            .prefix(prefix)
                            .skipDuplicates(true)
                            .size(10)
            ));

            SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
            Suggest suggest = response.getSuggest();
            CompletionSuggestion oneSuggestion = suggest.getSuggestion("OneSuggestion");
            List<CompletionSuggestion.Entry.Option> options = oneSuggestion.getOptions();
            for (CompletionSuggestion.Entry.Option option : options) {
                String text = option.getText().toString();
                list.add(text);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        return list;
    }

数据同步

双写一致性

同步调用数据耦合,业务耦合
ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java

异步通知:增加实现难度
ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java
监听binlog(记录增删改操作):增加mysql压力,中间价搭建
ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步,ElasticSearch,elasticsearch,android,大数据,java文章来源地址https://www.toymoban.com/news/detail-660851.html

到了这里,关于ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务04 分布式搜索引擎 elasticsearch DSL数据聚合 自动补全 数据同步 集群 Sentinel

    聚合(aggregations)可以让我们极其 方便的实现对数据的统计、分析、运算 。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些 统计功能的比数据库的sql要方便的多,而且查询速度非常快 ,可以实现近

    2024年02月11日
    浏览(43)
  • 微服务04 分布式搜索引擎 elasticsearch DSL数据聚合 自动补全 数据同步 集群 微服务保护 Sentinel

    聚合(aggregations)可以让我们极其 方便的实现对数据的统计、分析、运算 。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些 统计功能的比数据库的sql要方便的多,而且查询速度非常快 ,可以实现近

    2024年02月15日
    浏览(45)
  • 【ElasticSearch】深入探索 ElasticSearch 对数据的聚合、查询自动补全、与数据库间的同步问题以及使用 RabbitMQ 实现与数据库间的同步

    在本文中,我们将深入探讨 ElasticSearch 在数据处理中的关键功能,包括数据聚合、查询自动补全以及与数据库的同步问题。 首先,我们将聚焦于 ElasticSearch 强大的聚合功能,解释什么是聚合以及如何通过 DSL 语句和 RestClient 实现各种聚合操作。这一功能能够让我们更深入地了

    2024年02月08日
    浏览(47)
  • Elasticsearch --- 数据聚合、自动补全

    聚合(aggregations) 可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现近实

    2024年02月04日
    浏览(39)
  • SpringCloud学习路线(12)——分布式搜索ElasticSeach数据聚合、自动补全、数据同步

    一、数据聚合 聚合(aggregations): 实现对文档数据的统计、分析、运算。 (一)聚合的常见种类 桶(Bucket)聚合: 用来做文档分组。 TermAggregation: 按照文档字段值分组 Date Histogram: 按照日期阶梯分组,例如一周一组,一月一组 度量(Metric)聚合: 用以计算一些值,比如

    2024年02月15日
    浏览(37)
  • SpringCloud(十)——ElasticSearch简单了解(三)数据聚合和自动补全

    聚合 (aggregations)可以实现对文档数据的统计、分析、运算。 聚合常见的有三类: 桶(Bucket)聚合 :用来对文档做分组 TermAggregation:按照文档字段值分组 Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组 度量(Metric)聚合 :用以计算一些值,比如:最大

    2024年02月09日
    浏览(34)
  • elasticsearch 拼音分词器 & 自动补全。

    2. 自动补全。 当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项,如图。 这种根据用户输入的字母,提示完整词条的功能,就是自动补全了。 因为需要根据拼音字母来推断,因此要用到拼音分词功能。 2.1. 拼音分词器。 要实现根据字母做补全,就必须对文

    2024年02月06日
    浏览(42)
  • Elasticsearch聚合、自动补全 | 黑马旅游

    聚合(aggregations) 可以实现对文档数据的统计、分析、运算。 聚合常见有三类: 桶聚合 Bucket :对文档数据分组,并统计每组数量 TermAggregation:按照文档字段值分组(有点像mysql的group by) Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月一组 度量聚合 Metric :对

    2024年02月01日
    浏览(38)
  • ElasticSearch - 基于 拼音分词器 和 IK分词器 模拟实现“百度”搜索框自动补全功能

    目录 一、自动补全 1.1、效果说明 1.2、安装拼音分词器 1.3、自定义分词器 1.3.1、为什么要自定义分词器 1.3.2、分词器的构成 1.3.3、自定义分词器 1.3.4、面临的问题和解决办法 问题 解决方案 1.4、completion suggester 查询 1.4.1、基本概念和语法 1.4.2、示例 1.4.3、示例(黑马旅游)

    2024年02月07日
    浏览(41)
  • ES(二)| 安装ES、Kibana、IK分词器、拼音分词器(自动补全)

    上一篇:ES(一)| ES简介、倒排索引、索引库操作语法、文档操作语法、Java使用RestClient进行ES操作 安装包下载: 链接:https://pan.baidu.com/s/1Y1O0B8aG7qzRLFFVYo9nHw 提取码:hdyc 因为我们还需要部署 kibana 容器,因此需要让 es 和 kibana 容器互联。这里先创建一个网络: 这里我采用

    2023年04月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包