elasticsearch总结

本文详细介绍了Elasticsearch(简称els)的基本概念、启动流程、常见应用及分布式部署方案。作为基于Lucene的分布式搜索引擎,els广泛应用于日志收集、大数据处理等领域。在开发流程中,根据数据实时性需求选择数据同步方案,如使用API实时同步或通过定时任务+API更新。分布式部署时,通过配置集群名称和发现IP地址实现主从节点的高可用。在优化中,需平衡节点数量与分片的关系,确保高效稳定的搜索性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般需要安装elastic+ elastic-head
head提供前端页面展示数据使用。

​els是什么

lucence实现的分布式搜索引擎.

怎么做到的

基于lucence。

启动流程

1、elasticsearch: 本地自己测试,可以修改elasticsearch/bin 目录的 jvm.options中 -xms的参数256m。减少内存的损耗;
在els根目录bin目录下执行 elasticsearch.bat可执行文件。(闪退的话在小黑窗执行就可以看到错误)

2、elasticserach-head:在head根目录下,执行npm run start,即可启动head。

常见应用

分词搜索、日志采集处理(elk)、等。主要是大数据的处理。

基本概念


简单理解看上图。
目前es6.0之后,一个index只有一个types,但是后续types被取消。原因是 如果一个index中有多个type,type中如果有相同的fileds的话,这些相同的fileds是有冲突的。所以为了避免这种设计导致的用户容易犯的错误。后续index更像是一个表(即单库单表)

平时开发流程

1、数据同步方案

考虑数据的实时性要求
如果实时性很高要求的话,比如订单处理等关键业务,需要做到实时同步,在订单生成的时候采用api同步。(这里其实也可以直接通过mq去做,mq有消息重试的机制,保证一致性)

这里要考虑同步失败的情况,避免业务受到影响,需要在一次失败后就放弃,后续处理用mq来实现,失败就加入mq。

实时性要求不高的话,有两种方案:
1、使用中间件比如elasticsearch-jdbc处理。
好处:简单。不用在代码层面操作。
缺点:1、不能对数据做复杂处理,因为有时候我们直接的数据并不是一条语句能解决的,可能是多个表的关联查询。2、对于删除也满足不了。
所以适用的场景:数据不复杂,数据采用逻辑删除或者不删除。或者删除用api更新,其他的使用插件更新。

2、采用定时任务+ api更新的操作。记录修改的数据,定时任务去定时增删改。
该种方式以我们公司实际的应用举例:商品的分词搜索。

多sku商品的增删改。
商品删除的动作有多种情况;
1)、商品spu被删除了。
2)、商品的某个sku被删除了,但是spu没有删除,这会种情况是商品被修改了。

商品新增: 1)、商品spu增加了。
商品修改: 1)、就是商品sku被修改了。也可以导致sku被删除。

大概的步骤是这样:
1、采用数据库触发器记录更新和删除的skuid。对于新增使用redis维护一个id增量。

redis维护id增量的必要性考虑:可以根据修改时间和新增时间进行更新或者新增操作
(不好的地方:需要额外维护一个字段,因为要加索引,不然查找很慢,另外db的压力也不小)。

2、定时任务执行记录日志,对更新的skuid对应的spuid进行相应的操作。
3、执行完毕后删除日志记录。)
好处: 对代码没有耦合。商品zsg的操作不会有其他操作。
缺点: db压力不小。(可以通过相关的操作进行规避,比如商品修改之后设置一个修改的flag,但是这种场景太多了,代码耦合会比较大)
其他思路
1、商品zsg的时候将对应的spuid传入到mq中,思路同上述的订单处理
好处:不用维护zsg表。数据库压力也没那么大。
缺点: 耦合度方面比上一种方案高。
后续尝试下这种方案。应该是最终方案

分布式部署方案

es的分布式原理:主从。
服务器部署步骤:
1、每台服务器都安装对应的es.
2、配置好配置文件,关键点是集群名称、发现ip地址的配置。其他的交给es去操作即可。
3、启动每台服务器的es服务,即可实现高可用。

需要了解节点、分片、索引的关系。
节点:一个节点就是一个es实例,一个节点可以包含多个分片(主分和复制分片可以同时存在)。
分片:一个索引(有很多数据)有多个分片(所以说数据是被es分配在不同的分片中),分片有复制分片(可修改)和主分片(定义后不可修改)。
主节点的作用:因为是主从,所以需要进行写数据,同步数据,还有节点发现等。
复制分片里的数据就是主分片数据的复制。

所以节点需要部署在不同服务器上,可以避免单机故障。

1、单服务器多节点。这个没啥好说的。
2、多服务器多节点。
多服务器之间如何做服务发现。在yml配置文件中配置参数

discovery.zen.ping.unicast.hosts: 【ip地址】

es即可自动进行管理这些服务节点。

几个问题:
1、是否分片越多越好。
当然不是,节点不够的话,分片越多,就会导致很多分片无法进行分配,es状态会变黄。
即需要分析节点数量(服务器)和 分片之间的关系。

2、为何es要设计一个索引多个分片,而不是像关系型数据库一样,就一个index,一个分片。
我的理解:分片相当于分表,把同一个类型的数据分散存储,再配合node节点,可以做容灾备份,提高查询效率。比如查询某一个东西,符合条件的在不同的节点(所以说一台服务器最好就部署一个节点)上,那么可以充分利用不同节点的资源,另外不同分片,相当于对数据做了拆分。也能提高效率。

其他

1、中文分词器 ik分词下载地址(可以查看其他版本) :

elasticsearch-analysis-ik

验证查询语句是否正确:/test_ik/search_goods/_validate/query

2、搜索规则

请尽可能多的使用过滤式查询。

term 精确查询,这里的精确查找的意思是term的字段被包含在搜索出来的结果中,而不是和搜索出来的结果一样。精确的是输入的那个字段值

布尔过滤器
constant_score 查询包装器,复合查询包装其他复合或叶子查询

记住 term 查询只对倒排索引的词项精确匹配

语句的结构涉及到评分的计算,

boost 参数被用来提升一个语句的相对权重

match 匹配查询

如果单独地不加任何修饰词地使用 “query” 这个词,我们指的是 “scoring query” 。(评分查询),相对的,使用filter查询时不评分查询,速度很快且会被缓存。

如何选择查询与过滤
通常的规则是,使用查询(query)语句来进行 全文 搜索或者其它任何需要影响 相关性得分 的搜索。除此以外的情况都使用过滤(filters)。

muilt_match ^ 字符语法为单个字段提升权重, 采用最佳字段的策略

倒排索引

默认全文搜索的结果是 or

在{“enabled”:true}的情况下可以根据ID直接检索对应source JSON的字段,不用去倒排索引去按Field取数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值