当前位置:   article > 正文

ElasticSearch总结

ElasticSearch总结

ElasticSearch的主要功能及应用场景?

·主要功能: )海量数据的分布式存储以及集群管理,达到了服务与数据的高可用以及水平扩展; 2)近实时搜索,性能卓越。对结构化、全文、地理位置等类型数据的处理: 3)海量数据的近实时分析(聚合功能)

1、为什么要使用Elasticsearch?

Es是基于倒排索引实现的,(解释一下),会对你所搜的内容分词,将词条放到结果集中,然后返回相应的ID,根据Id找词条 1)网站搜索、垂直搜索、代码搜索: 2)日志管理与分析、安全指标监控、应用性能监控、Wb抓取舆情分析 在mysql中,使用的是正排索引,根据主键id建立b+树索引,然后通过目录页对应到数据页,然后找到数据。对于传统的增删改查(用id)没有任何问题,速度也很快。 但是在查询过于复杂,数据量很大的时候,用es做全文检索效率更高,还有一方面是,它查询的时候是在ES索引库里查询的,不直接查询数据库,给数据库减轻压力 。

倒排索引

倒排索引注意细节:倒排索引中的所有词对应一个或多个文档;倒排索引中的词项根据字典顺序升序排列 怎么用的 我们在用的时候是公司在Linux服务器上搭建的ElasticSearch服务,我们操作的时候,是用Springboot结合的ElasticSearch用的,因为SpringBoot自带的有ElasticSearch的依赖,只需要配置连接就行,我们自定义一个接口,让这个接口继承ElasticsearchRepository这个接口,这个接口里封装的有一些save和saveall一些方法,还有delete方法,我们从数据库查询出来的内容,使用提前定义好的索引的pojo类,直接就能存到索引库里.我还用过ElasticSearch里的聚合查询,里面可以根据分类进行聚合查询,聚合里还有一个桶的概念,先找到聚合名称再遍历里面的桶。

数据类型

ElasticSearch 里面数据类型有数值类型,布尔类型,字符串类型,日期类型等等,像字符串类型的话,在5.0以后,有重大变更,移除了string类型,string字段被拆分成两种新的数据类型: text和keyword。 text: 会分词,然后进行索引,用于全文搜索。 支持模糊、精确查询 不支持聚合 keyword:不进行分词,直接索引,keyword用于关键词搜索 支持模糊、精确查询 支持聚合

数据库修改信息如何同步ElasticSearch?

我们是结合的RabbitMQ来做的,因为我们是微服务架构,项目之间进行通信就可以了,我们把审核通过的景点,发送到rabbitmq消息队列中一个景点id,我们通过监听到这个id就可以查询出该景点信息,然后调用ElasticsearchRepository中的save方法存到索引库去,如果修改了信息我们也是发送消息来同步的. 1.同步调用:直接在代码里写逻辑,数据在增删改查进数据库的同时,也往es里同步一份 2.使用官方的logstach,定时查询数据库,查询到数据有变化就发送到es中 3.利用数据库的binlogl同步变化数据,然后将数据发送给es,当然也可以通过java代码监听拿到数据,再发送到es或做其他处理。 4.MQ中间件,有数据变化的时候,就通知mq,然后监听mq实现数据同步到mq

分片副本概念

Elasticsearch 会对存储的数据进行切分,将数据划分到不同的分片上,同时每一个分片会保存多个副本,主要是为了保证分布式环境的高可用。副本是指的备份,我们项目中设置的是3个分片两个副本. 在 Elasticsearch 中,节点是对等的,节点间会选取集群的 Master,由 Master 会负责集群状态信息的改变,并同步给其他节点

分组查询

es的分组其实就是那三种聚合,bucket,Metric,Pipeline,聚合允许我们将数据按照指定的字段进行分组,并计算每个组的各项指标,例如平均值、总和、计数、最小值、最大值等。 第一种,就是就类似于mysql的分组,group by 第二种,就是去做计算的,求和求平均值 第三种是,在原先基础上再次聚合,就是再次分组 聚合常见的有三类:

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

    • TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组

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

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

    • Avg:求平均值

    • Max:求最大值

    • Min:求最小值

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

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

注意:参加聚合的字段必须是keyword、日期、数值、布尔类型

ES在高并发下如何保证读写一致性?

(1)对于更新操作:可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖 每个文档都有一个version 版本号,这个版本号在文档被改变时加一。Elasticsearch使用这个 _version 保证所有修改都被正确排序。当一个旧版本出现在新版本之后,它会被简单的忽略。 利用version的这一优点确保数据不会因为修改冲突而丢失。比如指定文档的version来做更改。如果那个版本号不是现在的,我们的请求就失败了。 (2)对于写操作,一致性级别支持 quorum/one/all,默认为 quorum,即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点上重建。 one:要求我们这个写操作,只要有一个primary shard是active活跃可用的,就可以执行 all:要求我们这个写操作,必须所有的primary shard和replica shard都是活跃的,才可以执行这个写操作 quorum:默认的值,要求所有的shard中,必须是大部分的shard都是活跃的,可用的,才可以执行这个写操作 (3)对于读操作,可以设置 replication 为 sync(默认),这使得操作在主分片和副本分片都完成后才会返回;如果设置replication 为 async 时,也可以通过设置搜索请求参数 _preference 为 primary 来查询主分片,确保文档是最新版本。

Elasticsearch集群脑裂问题?

所谓脑裂问题(类似于精神分裂),就是同一个集群中的不同节点,对于集群的状态有了不一样的理解。 由于某些节点的失效,部分节点的网络连接会断开,并形成一个与原集群一样名字的集群,这种情况成为集群脑裂(split-brai)现象。这个问题非常危险,因为两个新形成的集群会同时索引和修改集群的数据。

“脑裂问题可能的成因:·网络问题:集群间的网络延迟导致一些节点访问不到master,认为master挂掉了从而选举出新的master,并对master上的分片和副本标红,分配新的主分片 ·节点负载:主节点的角色既为master又为data,访问量较大时可能会导致ES停止响应造成大面积延迟,此时其他节点得不到主节点的响应认为主节点挂掉了,会重新选取主节点。 ·内存回收:data节点上的ES进程占用的内存较大,引发JVM的大规模内存回收,造成ES进程失去响应

脑裂问题解决方案:

  1. 增加最小主节点数:通过调整discovery.zen.minimum_master_nodes参数,确保在发生网络分区时,只有足够数量的节点才能形成主节点,减少误判的可能性。

  2. 角色分离:将master节点与data节点分离,确保master节点专注于集群管理,而data节点专注于数据处理。这可以减少master节点的负载,提高集群的稳定性。

  3. 调整超时设置:通过调整心跳超时时间(heartbeat timeout)和选举超时时间(election timeout)等参数,可以在网络分区或节点故障发生时更及时地检测和处理问题。

  4. 使用自动发现机制:利用Elasticsearch提供的自动发现机制,如集群发现或基于云平台的发现插件,确保在节点加入或离开集群时能够自动进行配置更新。

  5. 定期备份数据:定期进行数据备份,以便在发生脑裂或其他数据一致性问题时能够恢复数据。

ElasticSearch和Solr的区别?

我知道他俩的底层都是基于lucene的倒排索引实现分布式实时全文搜索引擎,每个字段都被索引并可以被搜索, 倒排索引: 在搜索引擎中,每个文档都对应一个对应的文档ID,文档内容被表示为一系列关键词的集合。倒排索引就是关键词到文档Id的映射,每个关键词都对应一系列的文件,这些文件中都出现了这个关键词。有了倒排索引,搜索引擎可以很方便地响应用户的查询。(倒排索引注意细节:倒排索引中的所有词对应一个或多个文档;倒排索引中的词项根据字典顺序升序排列) solr在实时建立索引的时候会产生IO阻塞查询性能会比ElasticSearch差一些,还有就是因为Solr自身不支持分布式,可以快速存储、搜索、分析海量数据。ES可以组成一个网络,如果其中一台服务器宕机,会分配其他节点工作,可以扩展多台服务器,所以查询效率会更快,据说可以处理PB以上级别的数据。 ElasticSearch中的字符串类型: ES在 5.0以后,字符串类型有重大变更,移除了string类型,string字段被拆分成两种新的数据类型: text和keyword。 Text类型在存入ES的时候会分词,然后根据分词后的内容建立倒排索引,用于全文搜索。支持模糊、精确查询、不支持聚合。 keyword:不进行分词,直接根据字符串内容建立倒排索引,keyword用于关键词搜索,支持模糊、精确查询、支持聚合。

ES与数据库数据保持一致

1 项目中我们查询景点信息就是调用ElasticsearchRepository中的save方法存到索引库去,如果修改了信息我们也是通过RabbitMQ发送消息来保证与数据库数据一致,因为我们是微服务架构,项目之间进行通信就可以了,我们把审核通过的景点,发送到rabbitmq消息队列中一个景点id,我们通过监听到这个id就可以查询景点信息。. 我还用过ElasticSearch里的聚合查询,里面可以根据分类进行聚合查询,聚合里还有一个桶的概念,先找到聚合名称再遍历里面的桶。 我们ES分词时这么做的:我们用的是IK分词器,我知道如果还需要自定义一些分词的话得修改里面有一个dic文件,自定义比如说小儿氨酚黄那敏颗粒这个词在字典里没有,得需要自定义一下。

2 也可以用cancal监听mysql的binlog文件来实现,之前的文章也有讲

链接:   cancal技术同步

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/424878
推荐阅读
相关标签
  

闽ICP备14008679号