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

文章目录

  • 数据聚合
    • 一、聚合的种类
    • 二、DSL实现聚合
      • 1、Bucket(桶)聚合
      • 2、Metrics(度量)聚合
    • 三、RestAPI实现聚合
  • 自动补全
    • 一、拼音分词器
    • 二、自定义分词器
    • 三、自动补全查询
    • 四、实现搜索款自动补全(例酒店信息)
  • 数据同步
    • 双写一致性

数据聚合

一、聚合的种类

官方文档 => 聚合 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(桶)聚合

在这里插入图片描述

_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(度量)聚合

在这里插入图片描述

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

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

三、RestAPI实现聚合

在这里插入图片描述

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;}}

自动补全

一、拼音分词器

在这里插入图片描述

下载拼音分词器:https://github.com/medcl/elasticsearch-analysis-pinyin/releases/tag/v8.6.0
解压放在plugins目录下(docker挂载的目录),然后重启es
在这里插入图片描述

二、自定义分词器

在这里插入图片描述
在这里插入图片描述

拼音分词器的过滤规则,参照上面下载的链接。
在这里插入图片描述

创建一个自定义分词器(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"}}}
}

在这里插入图片描述

三、自动补全查询

completion suggester查询:

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

在这里插入图片描述

// 自动补全的索引库
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条结果}}}
}

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

在这里插入图片描述在这里插入代码片

构建索引库

// 酒店数据索引库
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 // 跳过重复的}}}
}

在这里插入图片描述
在这里插入图片描述

    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;}

数据同步

双写一致性

同步调用数据耦合,业务耦合
在这里插入图片描述

异步通知:增加实现难度
在这里插入图片描述
监听binlog(记录增删改操作):增加mysql压力,中间价搭建
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/44266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tomcat结构目录有哪些?

bin 启动&#xff0c;关闭和其他脚本。这些 .sh文件&#xff08;对于Unix系统&#xff09;是这些.bat文件的功能副本&#xff08;对于 Windows系统&#xff09;。由于Win32命令行缺少某些功能&#xff0c;因此此处包含一些其他文件。 比如说&#xff1a;windows下启动tomcat用的…

【rust/egui】(三)看看template的app.rs:序列化、持久化存储

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 serde app.rs中首先定义了我们的Templ…

Git判断本地是否最新

场景需求 需要判断是否有新内容更新,确定有更新之后执行pull操作&#xff0c;然后pull成功之后再将新内容进行复制到其他地方 pgit log -1 --prettyformat:"%H" HEAD -- . "origin/HEAD" rgit rev-parse origin/HEAD if [[ $p $r ]];thenecho "Is La…

域名解析和代理

购买域名 这里使用腾讯云进行购买。 对域名进行解析 通过添加记录接口对域名进行解析。 此时我们的服务器地址就被解析到域名上了。 我们可以通过以下格式进行访问&#xff1a; [域名]:[对应的项目端口] 效果为下: 通过nginx进行代理 如果我们使用上述的方式进行访问还是…

c语言strtol函数、strtod函数、strtoul函数浅悉

---------------- | strtol | ---------------- i.e. string to long long int strtol(const char *nptr, char **endptr, int base) strtol()会将nptr指向的字符串&#xff0c;根据参数base&#xff0c;按权转化为long int, 然后返回这个值。 参数base的范…

【hive】hive分桶表的学习

hive分桶表的学习 前言&#xff1a; 每一个表或者分区&#xff0c;hive都可以进一步组织成桶&#xff0c;桶是更细粒度的数据划分&#xff0c;他本质不会改变表或分区的目录组织方式&#xff0c;他会改变数据在文件中的分布方式。 分桶规则&#xff1a; 对分桶字段值进行哈…

使用图像处理算法检测金属表面的生锈区域: Python实现及步骤解析

摘要&#xff1a; 本文主要介绍如何使用Python和OpenCV库来实现对金属表面的生锈区域的检测。图像处理在工业领域有着广泛的应用&#xff0c;尤其是对材料的表面缺陷的检测。本文将详细阐述该算法的具体实现步骤&#xff0c;并提供完整的Python代码示例。 1. 引言 金属的锈蚀是…

flutter-设置开屏页 解决开屏白屏问题

flutter_native_splash 当您的应用程序打开时&#xff0c;本机应用程序会短暂加载 Flutter。默认情况下&#xff0c;在此期间&#xff0c;本机应用程序会显示白色启动屏幕。该包自动生成 iOS、Android 和 Web 本机代码&#xff0c;用于自定义本机启动画面背景颜色和启动图像。支…

Webshell的过滤绕过

目录 Webshell的过滤绕过 1.异或操作绕过 2.取反操作绕过 3.PHP语法绕过 的过滤绕过 1.异或操作绕过 先来看一段代码 <?phpecho "A"^"";//结果为"!" ?> 为什么会输出"!" 之所以会得到这样的结果&#xff0c;是因为代…

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等 一、react-redux介绍二、React-Redux-基本使用三、获取状态useSelector四、分发动作useDispatch五、 Redux 数据流六、代码结构七、ActionType的使用八、Reducer的分离与合并九、购物挣…

计算机视觉的应用11-基于pytorch框架的卷积神经网络与注意力机制对街道房屋号码的识别应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用11-基于pytorch框架的卷积神经网络与注意力机制对街道房屋号码的识别应用&#xff0c;本文我们借助PyTorch&#xff0c;快速构建和训练卷积神经网络&#xff08;CNN&#xff09;等模型&#xff0c;…

【Redis从头学-5】Redis中的List数据类型实战场景之天猫热销榜单

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…

Debain和MariaDB简单设置

1. Debian静态ip设置 没有网络寸步难行&#xff0c;所以要首先设置静态IP访问&#xff0c;确保网络正常。 设置静态IP vi /etc/network/interfacesauto ens33 # 开机自启ens33网卡 iface lo inet loopback # 设置回环网卡 allow-hotplug ens33 ifac…

git错误记录

露id没有影响&#xff0c;搞得微软不知道我ip一样 git fatal: 拒绝合并无关的历史的错误解决(亲测有效)

校园网安全风险分析

⒈物理层的安全风险分析 网络的物理安全风险主要指网络周边环境和物理特性引起的网络设备和线路的不可用 , 而 造成网络系统的不可用。我们在考虑校园网络安全时&#xff0c;首先要考虑物理安全风险&#xff0c;它是整个 网络系统安全的前提。物理安全风险有&#xff1a;设备…

mybatis缓存

目的&#xff1a;提高查询效率。 映射语句文件中的所有 select 语句的结果将会被缓存。映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。缓存会使用最近最少使用算法&#xff08;LRU, Least Recently Used&#xff09;算法来清除不需要的缓存。缓存不会定时进行…

Matplotlib绘图知识小结--Python数据分析学习

一、Pyplot子库绘制2D图表 1、Matplotlib Pyplot Pyplot 是 Matplotlib 的子库&#xff0c;提供了和 MATLAB 类似的绘图 API。 Pyplot 是常用的绘图模块&#xff0c;能很方便让用户绘制 2D 图表。 Pyplot 包含一系列绘图函数的相关函数&#xff0c;每个函数会对当前的图像进行…

Spring 整合RabbitMQ,笔记整理

1.创建生产者工程 spring-rabbitmq-producer 2.pom.xml添加依赖 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.7.RELEASE</version></dep…

爬虫框架- feapder + 爬虫管理系统 - feaplat 的学习简记

文章目录 feapder 的使用feaplat 爬虫管理系统部署 feapder 的使用 feapder是一款上手简单&#xff0c;功能强大的Python爬虫框架 feapder 官方文档 文档写的很详细&#xff0c;可以直接上手。 基本命令&#xff1a; 创建爬虫项目 feapder create -p first-project创建爬虫 …

根据源码,模拟实现 RabbitMQ - 实现消息持久化,统一硬盘操作(3)

目录 一、实现消息持久化 1.1、消息的存储设定 1.1.1、存储方式 1.1.2、存储格式约定 1.1.3、queue_data.txt 文件内容 1.1.4、queue_stat.txt 文件内容 1.2、实现 MessageFileManager 类 1.2.1、设计目录结构和文件格式 1.2.2、实现消息的写入 1.2.3、实现消息的删除…