当前位置: 首页 > news >正文

Spring Cloud的ElasticSearch的进阶学习

目录

数据聚合

Bucket示例

Metric示例

RestAPI实现聚合

自动补全

使用拼音分词

自定义分词器

实现自动补全

RestAPI实现自动补全功能

数据同步

同步调用

异步通知

监听binlog


数据聚合

聚合可以实现对文档数据的统计、分析、运算。聚合常见的有三类:

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

需要注意的是,聚合的数据不能被分词。

Bucket示例

根据品牌名称做聚合

#聚合功能
GET /hotel/_search
{"size": 0,// 展示的文档个数"aggs": {// 聚合"brandAgg": { //聚合名称"terms": { //聚合方式"field": "brand", "order": {"_count": "desc"},"size": 10 //结果展示}}}
}

默认情况加Bucket聚合是对所有文档进行聚合,这样对内存消耗较大,因此我们可以通过query指定聚合范围

GET /hotel/_search
{"query": {"range": {"price": {"gte": 100,"lte": 200}}}, "size": 0,"aggs": {"brandAgg": {"terms": {"field": "brand","size": 10}}}
}

Metric示例

对每个品牌的评分进行聚合。

GET /hotel/_search
{"size": 0,"aggs": {"brandAggs": {"terms": {"field": "brand","size": 10},"aggs": {"score_stats": {"stats": {"field": "score"}}}}}
}

如果需要对评分做一个排序,实际上是对桶聚合排序

GET /hotel/_search
{"size": 0,"aggs": {"brandAggs": {"terms": {"field": "brand","size": 10,"order": {"score_stats.avg": "desc"}},"aggs": {"score_stats": {"stats": {"field": "score"}}}}}
}

RestAPI实现聚合

    @Testpublic void testAggregation() throws Exception {SearchRequest request = new SearchRequest("hotel");//不需要接收文档request.source().size(0);request.source().aggregation(//聚合名称AggregationBuilders.terms("brandAgg")//聚合字段.field("brand")//取值.size(10));SearchResponse response = client.search(request, RequestOptions.DEFAULT);//结果解析Aggregations aggregations = response.getAggregations();Terms brand_agg = aggregations.get("brandAgg");List<? extends Terms.Bucket> buckets = brand_agg.getBuckets();for (Terms.Bucket bucket : buckets) {String brand = bucket.getKeyAsString();System.out.println(brand);}}

解析结果根据ES的返回内容依次获取就好

自动补全

所谓自动补全,是指输入部分内容会展示对应的相关内容

使用拼音分词

如果要实现根据字母补全内容,那么就需要对文档进行拼音分词。下载对应版本的拼音分词插件

GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is used to do conversion between Chinese characters and Pinyin.

并放入es的插件目录下

GET /_analyze
{"text": ["我正在学分布式搜索"],"analyzer": "pinyin"
}

默认的拼音分词器只会单个汉字的拼音与整句的拼音首字母分词。并不能满足我们的业务需求。因此我们需要自定义分词器。

自定义分词器

elasticsearch中分词器的组成包含三部分:

  • character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符
  • tokenizer:将文本按照一定的规则切割成词条 (term)。例如keyword,就是不分词;还有ik_smart。
  • tokenizer filter:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等

自定义的分词器只能在创建索引库的时候指定

PUT /test
{"settings": {"analysis":{"analyzer": { // 自定义分词器"my_analyzer": {// 分词器名称"tokenizer":"ik_max_word","filter":"py"}},"filter": { // 自定义tokenizer filter"py":{ // 过滤器名称"type":"pinyin",// 过滤器类型,这里是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}}}}
}

拼音分词器只能创建倒排索引的时候使用而不适合在搜索的时候使用。

因此在创建索引库的时候,可以指定搜索分词器

PUT /test
{"settings": {"analysis":{"analyzer": { // 自定义分词器"my_analyzer": {// 分词器名称"tokenizer":"ik_max_word","filter":"py"}},"filter": { // 自定义tokenizer filter"py":{ // 过滤器名称//.....}}}},"mappings":{"properties": {"name" :{"type": "text","analyzer":"my_analyzer","search_analyzer": "ik_smart"}}}
}

实现自动补全

ES提供completion Suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了补全查询效率,对文档中字段有一定约束

  • 参与补全的必须是completion类型
  • 字段的内容一般是用来补全的多个词条形成的数组
PUT /test
{"mappings":{"properties":{"title":{"type":"completion"}}}
}POST /test/_doc
{"title":["Sony","WH-1000XM3"]
}POST /test/_doc
{"title":["SK-II","PITERA"]
}POST /test/_doc
{"title":["Niotendo","switch"]
}
# 自动补全查询
GET /test/_search
{"suggest": {"title_suggest":{"text":"s", "completion":{"field":"title","skip_duplicates": true,"size": 10}}}
}

RestAPI实现自动补全功能

    @Testpublic void testSuggest() throws Exception {SearchRequest request = new SearchRequest("hotel");request.source().suggest(new SuggestBuilder().addSuggestion("suggestions",//自定义,后面解析响应的时候也输入这个值就好SuggestBuilders.completionSuggestion("suggestion").prefix("bj").skipDuplicates(true).size(10)));SearchResponse response = client.search(request, RequestOptions.DEFAULT);CompletionSuggestion suggestions = response.getSuggest().getSuggestion("suggestions");for (CompletionSuggestion.Entry.Option option : suggestions.getOptions()) {String test = option.getText().string();System.out.println(test);}}

数据同步

ES一般和数据库联合使用,ES的数据来源于数据库,但是数据库的内容并不是一成不变的,因此ES与数据库就存在了数据同步问题。

同步调用

当客户端发起请求后,首先数据库进行修改,修改完成后去调用搜索服务的更新ES接口,等ES更新完成后返回结果给保存数据库的服务,再返回给客户端

优点:实现简单

缺点:

  • 代码耦合,在更新完数据库后需要添加调用ES更新接口的代码
  • 耗时增加,性能下降

异步通知

优点:耦合度低,实现难度一般

缺点:依赖MQ的可靠性

监听binlog

数据库可以开启binlog功能。当数据库发生CURD时,binlog会发生改变,由canal通知ES服务修改ES数据。

优点:完全解耦

缺点:开启binlog增加数据库负担。实现复杂度高

相关文章:

Spring Cloud的ElasticSearch的进阶学习

目录 数据聚合 Bucket示例 Metric示例 RestAPI实现聚合 自动补全 使用拼音分词 自定义分词器 实现自动补全 RestAPI实现自动补全功能 数据同步 同步调用 异步通知 监听binlog 数据聚合 聚合可以实现对文档数据的统计、分析、运算。聚合常见的有三类&#xff1a; …...

WordPress恢复时候遇到的几个问题

1&#xff0c;一键安装 LAMP 最好是选择 CentOS 这种成熟的系统&#xff0c;最开始用 Alibaba Linux 报了好几个错&#xff0c;懒得折腾&#xff0c;最后重置镜像了。 https://lnmp.org/ wget https://soft.lnmp.com/lnmp/lnmp2.0.tar.gz -O lnmp2.0.tar.gz && tar z…...

设备码解释

一、名词解释 Device ID&#xff1a;设备ID。 IMEI&#xff1a;&#xff08;International Mobile Equipment Identity&#xff09;国际移动设备标识的缩写。是由15位数字组成的“电子串号”&#xff0c;它与每台手机一一对应&#xff0c;每个IMEI在世界上都是唯一的。 MEID…...

基于Docker-consul容器服务更新与发现

目录 一、什么是服务注册与发现&#xff1a; 二、Docker-consul介绍&#xff1a; 三、consul的关键特性&#xff1a; 四、consul部署&#xff1a; 1.部署规划&#xff1a; 2.consul服务器部署&#xff1a; 2.1 建立consul服务&#xff1a; 启动consul后默认会监听5个端口&a…...

firefox浏览器添加自定义搜索引擎方法

firefox浏览器添加自定义搜索引擎方法 1.在地址栏添加搜索引擎2.Mycroft Project 搜索引擎附加组件3.通过扩展插件添加自定义搜索引擎 Firefox这货居然不支持直接网址%s的搜索引擎定义方式&#xff0c;以下是添加方法。 firefox国际版119.0 1.在地址栏添加搜索引擎 &#xff…...

redis rdb aof

appendonly yes # appendfsync always appendfsync everysec # appendfsync no E:\Document_Redis_Windows\redis-2.4.5-win32-win64\64bit appendonly.aof...

浮动模块布局

基本思路 若宽度和浏览器一样宽&#xff0c;则不需要设置width 一般父盒子使用标准流&#xff0c;然后标准流内使用浮动 一般父盒子需要居中显示&#xff0c;使用 margin: 0 auto; 注意浮动盒子之间的margin值 与 父盒子width、height值之间的相等关系&#xff0c;一定要计算…...

信号、进程、线程、I/O介绍

文章目录 信号进程进程通信线程可/不可重入函数线程同步互斥锁条件变量自旋锁读写锁 I/O操作阻塞/非阻塞I/OI/O多路复用存储映射I/O 信号 信号是事件发生时对进程的通知机制&#xff0c;可以看做软件中断。信号与硬件中断的相似之处在于其能够打断程序当前执行的正常流程。大多…...

【css3】涟漪动画

效果展示 dom代码 <div class"mapSelfTitle66"><div></div> </div> 样式代码 .mapSelfTitle66{width:120px;height:60px;position: relative;&>div{width:100%;height:100%;background: url("~/assets/images/video_show/err…...

基础课17——智能客服系统

客户服务是一种以客户为中心的服务模式&#xff0c;旨在提高客户满意度和忠诚度&#xff0c;促进企业业务增长和可持续发展。在客户服务中&#xff0c;企业需要了解客户需求&#xff0c;提供优质、高效、个性化的服务&#xff0c;解决客户问题&#xff0c;满足客户需求&#xf…...

vue3 ts 导出PDF jsPDF

jsPDF 是一个基于 HTML5 的客户端解决方案&#xff0c;用于生成各种用途的 PDF 文档。 1、安装&#xff1a;npm install jspdf npm install --save html2canvas 2、引入&#xff1a;import jsPDF from "jspdf" import html2canvas from html2canvas 3、使用 <…...

Agent 应用于提示工程

如果Agent模仿了人类在现实世界中的操作方式&#xff0c;那么&#xff0c;能否应用于提示工程即Prompt Engingeering 呢&#xff1f; 从LLM到Prompt Engineering 大型语言模型(LLM)是一种基于Transformer的模型&#xff0c;已经在一个巨大的语料库或文本数据集上进行了训练&…...

云原生安全日志审计

记得添加&#xff0c;把配置文件挂载进去 - mountPath: /etc/kubernetes/auditname: audit-policyreadOnly: true.....- hostPath:path: /etc/kubernetes/audit/type: DirectoryOrCreatename: audit-policy/etc/kubernetes/manifests/kube-apiserver.yaml 具体配置文件如下 a…...

2023 辽宁省大学数学建模 B 题 数据驱动的水下导航适配区分类预测

“海洋强国”战略部署已成为推动中国现代化建设的重要组成部分&#xff0c;国家对 此提出“发展海洋经济&#xff0c;保护海洋生态环境&#xff0c;加快建设海洋强国”的明确要求。 《辽宁省“十四五”海洋经济发展规划》明确未来全省海洋经济的发展战略、 发展目标、重大任…...

ES 8.x新特性一览(完整版)

一、看点 在 2022 年 2 月 11 日&#xff0c;Elasticsearch&#xff08;ES&#xff09;正式发布了 8.0 版本&#xff0c;而截止到 2023 年 10 月&#xff0c;历经一年半时间&#xff0c;ES官方已经连续发布了多个版本&#xff0c;最新版本为 8.10.4。这一系列的更新引入了众多引…...

生产实战shell,给安全部门提供日志

生产实战shell,给安全部门提供日志 #!/bin/bashbackup_dir"/data/rw_copy" log_dir"/data/weblogic_log/test/yingyong" nginx_log_dir"/data/nginx_log" apache_log_dir"/data/apache_log" weblogic_log_dir"/data/weblogic_lo…...

HarmonyOS数据管理与应用数据持久化(一)

一. 数据管理概述 功能介绍 数据管理为开发者提供数据存储、数据管理能力&#xff0c;比如联系人应用数据可以保存到数据库中&#xff0c;提供数据库的安全、可靠等管理机制。 数据存储&#xff1a;提供通用数据持久化能力&#xff0c;根据数据特点&#xff0c;分为用户首选项、…...

小型气象站在智慧农业高标准农田建设中的作用

了解“小型气象站在智慧农业高标准农田建设中的作用”&#xff0c;我们需要了解什么是小型气象站&#xff1f;什么是高标准农田&#xff1f; 所谓小型气象站是一种气象观测设备&#xff0c;根据应用领域不同可分为农业气象站&#xff0c;校园气象站&#xff0c;森林气象站&…...

kruskal求最小生成树

算法思路&#xff1a; 将所有边按照权值的大小进行升序排序&#xff0c;然后从小到大一一判断。 如果这个边与之前选择的所有边不会组成回路&#xff0c;就选择这条边分&#xff1b;反之&#xff0c;舍去。 直到具有 n 个顶点的连通网筛选出来 n-1 条边为止。 筛选出来的边…...

876. 链表的中间结点

876. 链表的中间结点 算法 快慢指针 & 题目特征 需要对链表中的节点进行遍历&#xff0c;并且需要根据节点之间的相对位置或者距离进行操作 题目链接&#xff1a;https://leetcode.cn/problems/middle-of-the-linked-list/ 算法 快慢指针 & 题目特征 需要对链表中…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...