Elasticsearch高级

文章目录

  • 一.数据聚合
  • 二.RestAPI实现聚合
  • 三.ES自动补全(联想)
  • 四.数据同步
  • 五.elasticsearch集群


一.数据聚合

在ES中的数据聚合(aggregations)可以近似看做成mysql中的groupby分组,聚合可以实现对文档数据的统计、分析、运算,常见的聚合的分类有以下几种:

  • 桶(Bucket)聚合:用来对文档做分组

    • TermAggregation:按照文档字段值分组(即不能够进行分词的字段)

    • Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组

  • 度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等

    • Avg:求平均值

    • Max:求最大值

    • Min:求最小值

    • Stats:同时求max、min、avg、sum等

  • 管道(pipeline)聚合:其它聚合的结果为基础做聚合(很少用)


1.DSL实现Bucket(桶)聚合

语法:

GET /hotel/_search
{"size": 0,  // 设置size为0,结果中不包含文档,只包含聚合结果"aggs": { // 定义聚合(带有"s"证明可以定义多个聚合)"xxx": { //给聚合起个名字"terms": { // 聚合的类型(不能为text)"field": "xxx", // 参与聚合的字段"size": xxx // 希望获取的聚合结果数量}}}
}

默认情况下,Bucket聚合会统计Bucket内的文档数量,记为_count,并且按照_count降序排序 修改结果排序方式:

GET /hotel/_search
{"size": 0, "aggs": {"xxx": {"terms": {"field": "xxx","order": {"_count": "asc" // 按照_count升序排列},"size": 20}}}
}

默认情况下,Bucket聚合是对索引库的所有文档做聚合,我们可以限定要聚合的文档范围,只要添加query条件即可

示例:

GET /hotel/_search
{"query": {"range": {"price": {"lte": 200 // 只对200元以下的文档聚合}}}, "size": 0, "aggs": {"brandAgg": {"terms": {"field": "brand","size": 20}}}
}

2.DSL实现Metrics 聚合

例如,我们要求获取每个品牌的用户评分的min、max、avg等值.
我们可以利用stats聚合:

GET /hotel/_search
{"size": 0, "aggs": {"brandAgg": { "terms": { "field": "brand", "size": 20},"aggs": { // 是brands聚合的子聚合,也就是分组后对每组分别计算"score_stats": { // 聚合名称"stats": { // 聚合类型,这里stats可以计算min、max、avg等"field": "score" // 聚合字段,这里是score}}}}}
}

二.RestAPI实现聚合

1.发送聚合DSL语句(其实本质上就是一层一层按照DSL语句组成结构调用API,十分易懂也很简单):

在这里插入图片描述
2.聚合结果解析
在这里插入图片描述

java代码:

@Testvoid aggregation() throws IOException {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 terms=aggregations.get("brandAgg");List<? extends Terms.Bucket> buckets = terms.getBuckets();for (Terms.Bucket bucket : buckets) {String key = bucket.getKeyAsString();System.out.println(key);}}

三.ES自动补全(联想)

用途:当用户在搜索框输入字符时,我们应该提示出与该字符(汉字,英文)有关的搜索项

1.拼音分词

要实现根据字母做补全,就必须对文档按照拼音分词。在GitHub上恰好有elasticsearch的拼音分词插件。

下载地址:https://github.com/medcl/elasticsearch-analysis-pinyin

自定义分词器

elasticsearch中分词器(analyzer)的组成包含三部分

  • character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符

  • tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smart

  • tokenizer filter:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等

在这里插入图片描述

我们可以在创建索引库时,通过settings来配置自定义的analyzer(分词器):

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

拼音分词器适合在创建倒排索引的时候使用,但不能在搜索的时候使用(原因是搜索时会把文本转换为多个拼音和分词(如果添加了tokenizer分词的话),按照拼音搜索就会和倒排索引库里面的拼音匹配(包括拼音一致但是词义不一致的词),这就会导致搜索产生歧义)。

因此字段在创建倒排索引时应该用my_analyzer分词器;字段在搜索时应该使用ik_smart分词器(使用ik_smart时识别不了拼音,es会默认使用创建索引库时指定的分词器)

PUT /test
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "ik_max_word", "filter": "py"}},"filter": {"py": { ... }}}},"mappings": {"properties": {"name": {"type": "text","analyzer": "my_analyzer","search_analyzer": "ik_smart"}}}
}

2.completion suggester查询
elasticsearch提供了Completion Suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询的效率,对于文档中字段的类型有一些约束:

  • 参与补全查询的字段必须是completion类型。

  • 字段的内容一般是用来补全的多个词条形成的数组。

在这里插入图片描述

查询语法如下:

在这里插入图片描述
3.RestAPI实现自动补全

请求参数构造的API:
在这里插入图片描述
结果解析:
在这里插入图片描述
案例:实现酒店搜索页面输入框的自动补全

业务层代码:

 public List<String> getSuggestions(String prefix) {try {SearchRequest request=new SearchRequest("hotel");request.source().suggest(new SuggestBuilder().addSuggestion("suggestions",SuggestBuilders.completionSuggestion("suggestion").prefix(prefix).skipDuplicates(true).size(10)));SearchResponse response = client.search(request, RequestOptions.DEFAULT);Suggest suggest = response.getSuggest();CompletionSuggestion completionSuggestion = suggest.getSuggestion("suggestions");List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getOptions();List<String> suggestionList=new ArrayList<>(options.size());for (CompletionSuggestion.Entry.Option option : options) {String text = option.getText().toString();suggestionList.add(text);}return suggestionList;} catch (IOException e) {throw new RuntimeException(e);}}

四.数据同步

数据同步问题分析

elasticsearch中的酒店数据来自于mysql数据库,因此mysql数据发生改变时,elasticsearch也必须跟着改变,这个就是elasticsearch与mysql之间的数据同步。

方案一:同步调用(不推荐使用)

在这里插入图片描述

方案二:异步通知(推荐使用)

在这里插入图片描述

方案三:监听binlog(推荐使用)

在这里插入图片描述

总结:

方式一:同步调用

  • 优点:实现简单,粗暴

  • 缺点:业务耦合度高

方式二:异步通知

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

  • 缺点:依赖mq的可靠性

方式三:监听binlog

  • 优点:完全解除服务间耦合

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

案例:利用MQ实现mysql与elasticsearch数据同步

1.在hotel-demo引入amqp依赖

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

2.编写RabbitMQ的连接信息(yaml文件中,省略)

3.编写常量RabbitMQ的交换机,队列,Routing_Key的值

package cn.itcast.hotel.constants;public class RabbitMQConstants {/*** 交换机*/public static final String HOTEL_EXCHANGE="hotel.topic";/*** 新增或修改业务队列*/public static final String HOTEL_INSERT_QUEUE="hotel.insert.queue";/*** 删除业务队列*/public static final String HOTEL_DELETE_QUEUE="hotel.delete.queue";/*** 新增或修改业务ROUTING_KEY*/public static final String HOTEL_INSERT_KEY="hotel.insert";/*** 修改业务的ROUTING_KEY*/public static final String HOTEL_DELETE_KEY="hotel.delete";
}

4.定义交换机,队列,绑定交换机和队列,以及声明Routing_Key

package cn.itcast.hotel.mq;import cn.itcast.hotel.constants.RabbitMQConstants;
import cn.itcast.hotel.service.IHotelService;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class HotelListener {@Autowiredprivate IHotelService iHotelService;/*** 监听新增或修改的消息* @param id*/@RabbitListener(bindings = @QueueBinding(value = @Queue(name = RabbitMQConstants.HOTEL_INSERT_QUEUE),exchange = @Exchange(name = RabbitMQConstants.HOTEL_EXCHANGE),key = RabbitMQConstants.HOTEL_INSERT_KEY))public void listenHotelInsertOrUpdate(Long id){iHotelService.insertById(id);}/*** 监听删除的消息* @param id*/@RabbitListener(bindings = @QueueBinding(value = @Queue(name = RabbitMQConstants.HOTEL_DELETE_QUEUE),exchange = @Exchange(name = RabbitMQConstants.HOTEL_EXCHANGE),key = RabbitMQConstants.HOTEL_DELETE_KEY))public void listenHotelDelete(Long id){iHotelService.deleteById(id);}
}

5.在hotel-admin重复操作1,2,3

6.当执行增删改操作,发送消息到交换机中

	@PostMappingpublic void saveHotel(@RequestBody Hotel hotel) {hotelService.save(hotel);rabbitTemplate.convertAndSend(RabbitMQConstants.HOTEL_EXCHANGE, RabbitMQConstants.HOTEL_INSERT_KEY, hotel.getId());}@PutMapping()public void updateById(@RequestBody Hotel hotel) {if (hotel.getId() == null) {throw new InvalidParameterException("id不能为空");}hotelService.updateById(hotel);rabbitTemplate.convertAndSend(RabbitMQConstants.HOTEL_EXCHANGE, RabbitMQConstants.HOTEL_INSERT_KEY, hotel.getId());}@DeleteMapping("/{id}")public void deleteById(@PathVariable("id") Long id) {hotelService.removeById(id);rabbitTemplate.convertAndSend(RabbitMQConstants.HOTEL_EXCHANGE, RabbitMQConstants.HOTEL_DELETE_KEY, id);}

7.在hotel-demo处理消息(业务层实现)

public void insertById(Long id) {try {Hotel hotel = getById(id);HotelDoc hotelDoc = new HotelDoc(hotel);IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);client.index(request, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}}public void deleteById(Long id) {try {DeleteRequest request=new DeleteRequest("hotel").id(id.toString());client.delete(request, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}}

五.elasticsearch集群

1.ES集群结构

单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。

  • 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点

  • 单点故障问题:将分片数据在不同节点备份(replica )

在这里插入图片描述

2.ES集群的节点角色

elasticsearch中集群节点有不同的职责划分:

在这里插入图片描述

每一个节点其实都包含了四种节点类型

elasticsearch中的每个节点角色都有自己不同的职责,因此建议集群部署时,每个节点都有独立的角色。
在这里插入图片描述
3.ES集群的脑裂

默认情况下,每个节点都是master eligible节点,因此一旦master节点宕机,其它候选节点会选举一个成为主节点。当主节点与其他节点网络故障时,可能发生脑裂问题。

为了避免脑裂,需要要求选票超过 ( eligible节点数量 + 1 )/ 2 才能当选为主,因此eligible节点数量最好是奇数。对应配置项是discovery.zen.minimum_master_nodes,在es7.0以后,已经成为默认配置,因此一般不会发生脑裂问题

4.ES集群的分布式存储

当新增文档时,应该保存到不同分片,保证数据均衡,那么coordinating node(协调节点)如何确定数据该存储到哪个分片呢?

elasticsearch会通过hash算法来计算文档应该存储到哪个分片:

在这里插入图片描述


新增文档流程:

在这里插入图片描述


elasticsearch的查询分成两个阶段:

  • scatter phase:分散阶段,coordinating node会把请求分发到每一个分片
  • gather phase:聚集阶段,coordinating node汇总data node的搜索结果,并处理为最终结果集返回给用户

在这里插入图片描述


5.ES集群的故障转移

集群的master节点会监控集群中的节点状态,如果发现有节点宕机,会立即将宕机节点的分片数据迁移到其它节点,确保数据安全,这个叫做故障转移。

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

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

相关文章

基于APM(PIX)飞控和mission planner制作遥控无人车-从零搭建自主pix无人车普通舵机转向无人车-1(以乐迪crossflight飞控为例)

1.前期准备 准备通过舵机转向的无人车地盘、遥控器、地面站电脑、飞控等。安装驱动程序、端口程序、netframwork等&#xff0c;不再赘述。 2.安装固件 安装ardurover固件&#xff0c;如果在线失败&#xff0c;选择官方最新的固件下载到本地&#xff0c;选择本地安装。 3.调试…

智能仓库PTL管理系统

清晰电子墨水屏显示&#xff0c;无纸化作业&#xff0c;超低功耗 无线通信&#xff0c;穿透力强&#xff0c;极简部署 支持声光提醒&#xff0c;极大提高作业效率 适用场景&#xff1a;工厂&#xff0c;仓库&#xff0c;物流&#xff0c;货品分类等等

认识Docker

Docker 是世界领先的软件容器平台&#xff0c;所以想要搞懂 Docker 的概念我们必须先从容器开始说起。 1.1 什么是容器? 先来看看容器较为官方 一句话概括容器&#xff1a;容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署。 容器镜像是轻量的、可执行的…

希宝猫罐头怎么样?专业人士告诉你质量好又便宜的猫罐头推荐

作为从业6年的宠物护理师来说&#xff0c;只买合适的&#xff0c;贵的不如好的&#xff0c;只要配方不出错营养跟得上&#xff0c;观察自家猫咪体质真的基本不怎么出错。希望大家看完这篇文章&#xff0c;各位铲屎官都能买到满意的猫罐头。那么希宝猫罐头在各方面表现怎么样呢&…

UI咨询公司-蓝蓝设计:顶级秘籍:提升UI设计吸引力的3大绝招

想要让你的UI设计在海量应用中脱颖而出&#xff0c;吸引用户眼球吗&#xff1f;如果你正在寻找提升UI设计吸引力的绝妙方法&#xff0c;那么你绝对不能错过本文&#xff01;我们将为你揭示顶级UI设计师都不会告诉你的3大绝招&#xff0c;让你轻松掌握提升UI设计吸引力的关键技巧…

网络运维与网络安全 学习笔记2023.11.30

网络运维与网络安全 学习笔记 第三十一天 今日目标 实现AP自动注册、配置WLAN业务参数、无线终端通过wifi互访 实现AP自动注册 项目背景 企业内网的大量AP已经通过DHCP的方式获得IP地址 为了实现后期大量AP的统一管理&#xff0c;希望通过AC实现集中控制 在AC设备上&#…

SpringBoot框架结合Redis实现分布式锁

一、SpringBoot结合 Redis实现分布式锁 1.1、什么是分布式锁 分布式锁&#xff0c;是在分布式的环境下&#xff0c;才会使用到的一种同步访问机制&#xff0c;在传统的单体环境里面&#xff0c;不存在分布式锁的概念&#xff0c;只有在分布式环境里面&#xff0c;才有分布式锁…

赴日程序员高年薪过上“躺平”生活?

日本的IT行业想要达到的高薪&#xff0c;也是需要很多资历和经验的&#xff0c;不过即使你是新卒&#xff0c;也能拿到相比国内来说让你满意的薪资。 刚入职的起薪是20-23万日元/月&#xff0c;情报信息业出身&#xff0c;技术掌握不错&#xff0c;起薪是25万-30万日元。之后经…

git的安装及ssh配置(Linux)

环境 CentOS Linux release 7.9.2009 (Core) Xftp7 安装 方法一&#xff1a;yum安装 yum是一个客户端软件&#xff0c;就好比手机上的应用商店&#xff0c;帮助我们对软件的下载、安装和卸载 1、首先查看自己是否安装过git [rootxiaoxi ~]# git -bash: git: command not fo…

C++继承(详解)

一、继承的概念 1.1、继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结…

【JavaEE】单例模式

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

Python容器——字典

Key——Value 键值对

科技云报道:AI+PaaS,中国云计算市场迎来新“变量”?

科技云报道原创。 没有小的市场&#xff0c;只有还没有被发现的大生意。 随着企业数字化转型的逐级深入&#xff0c;市场需求进一步向PaaS和SaaS层进发&#xff0c;使之成为公有云服务市场增长的主要动力。 根据IDC最新发布的报告显示&#xff0c;2022-2027五年间中国公有云…

初识计算机网络

网络通信基础 1. IP地址2.端口号3.认识协议3.1协议分层 4. 网络数据传输的基本流程4.1 五元组4.2封装和分用 1. IP地址 IP地址主要用于表示网络主机,其他网络设备的网络地址,IP地址用于定位主机的网络地址 比如:发送快递的时候,需要知道对象的收货地址,才能将包裹送到目的地. …

APISpace 实名认证(身份证二要素)接口案例代码

1.实名认证&#xff08;身份证二要素&#xff09;API APISpace 的 实名认证&#xff08;身份证二要素API&#xff09;&#xff0c;核验身份证二要素&#xff08;姓名和身份证号码&#xff09;信息是否一致。 2.实名认证&#xff08;身份证二要素&#xff09;接口详情 2.1 接口…

外汇天眼:CySEC宣布与Titanedge Securities 达成90,000欧元的和解

塞浦路斯证券交易委员会&#xff08;CySEC&#xff09;12月1日宣布已经与塞浦路斯投资公司Titanedge Securities Ltd 达成了一项和解。 此次和解涉及可能违反了2017年《投资服务和活动以及受监管市场法》的情况。更具体地说&#xff0c;达成和解的调查涉及评估该公司在2017/565…

自动化测试的4大注意事项

自动化测试能够提高测试效率、覆盖率&#xff0c;降低测试成本和工作量&#xff0c;是软件开发中不可或缺的一部分。但前提是要确保自动化测试的有效性和可靠性&#xff0c;否则无效或错误的自动化测试&#xff0c;往往会对项目造成负面影响&#xff0c;如维护成本高、假阳性和…

高等职业学校新媒体营销实训室解决方案

背景 随着数字化时代的来临&#xff0c;新媒体营销成为企业推广和品牌建设的关键手段。为了培养高职学生在新媒体领域的实际操作能力&#xff0c;建立一套全面、系统的实训室方案至关重要。 目标 搭建高职新媒体营销实训室&#xff0c;旨在培养学生的实际操作能力&#xff0…

这些B端产品设计规范,你都知道吗?

设计规范虽然有其通用性&#xff0c;但因应对不同的业务环境和企业形态&#xff0c;其具体的运用可能会有所差异。对于新入行的B端设计师&#xff0c;各种B端组件可能会让他们感到困惑&#xff0c;不知在何种场景下应选择何种组件。这主要是因为我们在日常中学到的B端知识点多是…

人工智能与供应链行业融合:开启智能化供应链的新时代

随着人工智能技术的快速发展&#xff0c;供应链行业正迎来革命性变革。本文将探索人工智能在供应链管理中的应用领域&#xff0c;并分析其带来的益处和挑战&#xff0c;展望人工智能与供应链融合的未来发展趋势。 引言 供应链管理是企业运营中不可或缺的重要组成部分。它涵盖了…