0

深入了解Elasticsearch搜索引擎篇:倒排索引、架构设计与优化策略 - 努力的小雨

 8 months ago
source link: https://www.cnblogs.com/guoxiaoyu/p/17641804.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

什么是倒排索引?有什么好处?

倒排索引是一种用于快速检索的数据结构,常用于搜索引擎和数据库中。与传统的正排索引不同,倒排索引是根据关键词来建立索引,而不是根据文档ID。

倒排索引的建立过程如下:首先,将每个文档拆分成一系列的关键词或词项,然后建立一个词项到文档的映射。对每个关键词,记录包含该关键词的文档列表。倒排索引的结构类似于一个词项-文档倒排表,可以快速地定位包含特定关键词的文档。

倒排索引的好处有以下几点

  • 首先,它可以快速地定位到包含特定关键词的文档,提高检索效率。相比于正排索引,倒排索引不需要遍历整个文档集合,而是直接通过关键词索引到对应的文档列表,减少了搜索时间。
  • 其次,倒排索引可以支持复杂的查询操作。通过对多个关键词的组合查询,可以实现更精确的检索结果。倒排索引可以根据多个关键词的交集、并集或者其他逻辑关系来进行查询,提供更灵活的搜索功能。

搜索引擎为什么比MySQL查询快?

  • 倒排索引:搜索引擎使用倒排索引来构建索引,而MySQL使用正排索引。倒排索引是一种将关键词与文档进行映射的数据结构,能够快速定位包含特定关键词的文档。相比之下,正排索引需要遍历整个数据表才能找到匹配的记录。倒排索引的使用能够大大减少搜索时间,提高查询效率。
  • 分布式架构:搜索引擎往往采用分布式架构,将索引和数据分散存储在多个节点上。这种架构可以将查询请求并行处理,从而加快查询速度。相反,MySQL通常采用集中式架构,所有数据都存储在一个节点上,无法进行并行处理。

ES了解多少?说说你们公司的ES集群架构。

Elasticsearch(ES)是一个基于Lucene的开源搜索引擎,具有强大的全文搜索和分析能力。下面是一些ES的核心概念:

  • 索引(Index):索引是ES中最高级别的数据容器,它类似于数据库中的数据库。每个索引可以包含多个文档,并且可以定义不同类型的字段。
  • 类型(Type):类型是索引内的逻辑分组,它类似于数据库中的表。每个类型都有自己的映射,定义了文档中包含的字段和其数据类型。
  • 文档(Document):文档是ES中的最小数据单元。它是一个JSON格式的数据对象,类似于数据库中的一行记录。每个文档都有一个唯一的ID,用于标识和检索。
  • 字段(Field):字段是文档中的数据项,可以是文本、数字、日期等类型。每个字段都有自己的数据类型、分析器和索引选项。

一般来说,ES集群架构通常采用多机房多节点的方式。每个节点都是一个单独的ES实例,它们可以分布在不同的物理服务器或虚拟机上。一个集群可以包含多个节点,每个节点都有自己的唯一标识符和角色。

在一个ES集群中,索引被分为多个分片,每个分片是一个独立的、可被分配到不同节点上的数据单元。每个分片都有自己的副本,用于提高数据的可靠性和可用性。分片和副本的数量可以根据需求进行设置,通常会将它们分配到不同的机房,以确保一旦某个机房宕机,数据不会丢失。

ES集群还有一个主节点,它负责协调集群中的各个节点,处理集群的管理和状态相关的任务。

在应用中,ES常常与Logstash和Kibana组成ELK堆栈,用于实时的日志收集、存储和可视化。Logstash用于收集和处理日志数据(但通常会选择使用filebeat),将其发送到ES集群中进行索引和存储。Kibana则提供了一个直观的用户界面,用于查询和可视化ES中的数据。

如何进行中文分词?用过哪些分词器?

因为中文默认分词支持的不好,每个汉字都会分割开来,那么分词的意义也就没有了,不仅有以前的语句歧义,而且每天都会产生各种网络用语,如果支持的不好确实很容易导致搜索结果的混乱,但是我们也不用做的太细致,基本满足自己的业务需求即可,在搜索引擎方面毕竟百度'一统'中国,谷歌'一统'天下

因为中文在没有明显的分隔符的情况下很难进行准确的分词。在中文分词方面,常用的分词器有以下几种:

大家耳熟能详的IK分词器

HanLP是一款基于自然语言处理的中文分词器,具有较高的准确性和性能。它支持细粒度和智能分词模式,并且具备词性标注和命名实体识别等功能。

image

Jieba:Jieba是一款Python中文分词器,具有较快的分词速度和较好的准确性。它采用了基于前缀词典的分词算法,可以处理大规模文本的分词需求。

image

ES写入数据的工作原理是什么?

在了解ES写入数据的原理前,得知道ES节点有什么身份,ES节点身份包含如下:主节点、数据节点、协调节点;

  • 主节点是整个ES集群的"指挥官",负责管理集群的状态、进行索引的创建和删除、分配和迁移分片等操作。主节点是唯一的,当主节点不可用时,其他节点会重新选举一个新的主节点。
  • 数据节点是用来存储分片数据的节点。ES将索引分成多个分片,分布在不同的数据节点上,每个节点负责管理和存储一部分分片的数据。数据节点承担了实际的数据存储和检索工作。
  • 协调节点是将查询请求发送给数据节点,并在数据节点返回结果后进行结果的汇总和排序,然后将结果返回给客户端。协调节点的作用是协调各个数据节点的工作,提高查询的效率。
  • Ingest节点(摄取节点):用于在数据写入索引之前对数据进行预处理。Ingest节点可以执行一系列的处理操作,如数据的解析、转换、过滤等。它可以用于实时处理数据,将数据转换成适合索引的格式。

当写入请求到达任意节点时,该节点将扮演协调节点的角色。协调节点会负责接收请求,并进行一系列计算来确定数据应该存储在哪个数据节点上。如果集群中配置了Ingest节点,那么协调节点会将写入请求转发给Ingest节点进行数据的预处理。Ingest节点会执行管道中定义的操作,如数据转换、过滤、标准化等,然后将处理后的数据发送给相应的数据节点进行存储。

一旦数据节点接收到处理后的数据,它们将负责将数据存储到正确的分片和副本分片中。每个分片都存储着索引的一部分数据。当所有分片和副本分片都成功存储数据后,协调节点将返回成功的响应给客户端。

ES查询数据的工作原理是什么?

当一个查询请求到达协调节点时,协调节点会将请求发送到所有的数据节点上,并行进行查询操作。每个数据节点只负责查询自己所存储的分片数据,并返回查询结果给协调节点。协调节点会收集并合并所有数据节点的查询结果,然后进行归总和排序处理,最终将结果返回给客户端。

这种并行查询的方式可以提高查询的速度和性能,特别是在处理大量数据和复杂查询的情况下。同时,由于数据节点负责存储分片数据,可以将查询任务分配给不同的数据节点,从而实现负载均衡和分布式处理。这样的设计使得Elasticsearch能够快速响应查询请求,并处理大规模的数据。

ES部署时,要如何进行优化?

在JVM层面,确保将最大堆和最小堆内存设置为适当的大小,以充分利用系统的资源和处理能力。

在分片方面,确保合理的分片布局和数量。主分片和副本分片应该在同一个机房,以减少网络延迟。增加主分片的数量可以提高查询的并发性能。此外,使用SSD硬盘可以提高数据的读写速度。

在架构设计方面,确保在部署ES集群时提前设计好节点的身份,可以针对不同的节点进行专门的配置。主节点可以使用较低配置的硬件,主要负责集群状态的管理。数据节点需要提供较好的存储硬盘和内存,以存储和处理数据。协调节点需要提供大内存,以处理查询请求和汇总结果。如果需要处理写入请求的预处理,可以配置Ingest节点,实现读写分离,提高系统的性能和可扩展性。

在本次面试文章中,我们讨论了以下几个问题:

  • 倒排索引:倒排索引是一种用于快速检索的数据结构,它根据关键词建立索引,能够快速定位到包含特定关键词的文档。
  • ES集群架构:ES集群基本由主节点、数据节点和协调节点组成。主节点负责管理集群状态,数据节点存储分片数据,协调节点负责发送和汇总查询结果。
  • 中文分词:中文分词器包括IK、HanLP和Jieba等,用于将中文文本切分为单个词语,以便更好地进行索引和搜索。
  • ES写入数据的工作原理:写入请求经过协调节点进行分配和ingest节点预处理,然后由数据节点存储到相应的分片中。
  • ES查询数据的工作原理:查询请求并行发送到所有数据节点进行查询,然后由协调节点归总和处理结果。
  • ES部署优化:可调整JVM内存、分片布局和数量、节点身份设计、配置Ingest节点等,以提高性能和可扩展性。

希望这些总结可以帮助你们顺利进行面试


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK