倒排索引是一种用于快速检索的数据结构,常用于搜索引擎和数据库中。与传统的正排索引不同,倒排索引是根据关键词来建立索引,而不是根据文档ID。
倒排索引的建立过程如下:首先,将每个文档拆分成一系列的关键词或词项,然后建立一个词项到文档的映射。对每个关键词,记录包含该关键词的文档列表。倒排索引的结构类似于一个词项-文档倒排表,可以快速地定位包含特定关键词的文档。
倒排索引的好处有以下几点
搜索引擎为什么比MySQL查询快?
Elasticsearch(ES)是一个基于Lucene的开源搜索引擎,具有强大的全文搜索和分析能力。下面是一些ES的核心概念:
一般来说,ES集群架构通常采用多机房多节点的方式。每个节点都是一个单独的ES实例,它们可以分布在不同的物理服务器或虚拟机上。一个集群可以包含多个节点,每个节点都有自己的唯一标识符和角色。
在一个ES集群中,索引被分为多个分片,每个分片是一个独立的、可被分配到不同节点上的数据单元。每个分片都有自己的副本,用于提高数据的可靠性和可用性。分片和副本的数量可以根据需求进行设置,通常会将它们分配到不同的机房,以确保一旦某个机房宕机,数据不会丢失。
ES集群还有一个主节点,它负责协调集群中的各个节点,处理集群的管理和状态相关的任务。
在应用中,ES常常与Logstash和Kibana组成ELK堆栈,用于实时的日志收集、存储和可视化。Logstash用于收集和处理日志数据(但通常会选择使用filebeat),将其发送到ES集群中进行索引和存储。Kibana则提供了一个直观的用户界面,用于查询和可视化ES中的数据。
因为中文默认分词支持的不好,每个汉字都会分割开来,那么分词的意义也就没有了,不仅有以前的语句歧义,而且每天都会产生各种网络用语,如果支持的不好确实很容易导致搜索结果的混乱,但是我们也不用做的太细致,基本满足自己的业务需求即可,在搜索引擎方面毕竟百度'一统'中国,谷歌'一统'天下
因为中文在没有明显的分隔符的情况下很难进行准确的分词。在中文分词方面,常用的分词器有以下几种:
大家耳熟能详的IK分词器
HanLP是一款基于自然语言处理的中文分词器,具有较高的准确性和性能。它支持细粒度和智能分词模式,并且具备词性标注和命名实体识别等功能。
Jieba:Jieba是一款Python中文分词器,具有较快的分词速度和较好的准确性。它采用了基于前缀词典的分词算法,可以处理大规模文本的分词需求。
在了解ES写入数据的原理前,得知道ES节点有什么身份,ES节点身份包含如下:主节点、数据节点、协调节点;
当写入请求到达任意节点时,该节点将扮演协调节点的角色。协调节点会负责接收请求,并进行一系列计算来确定数据应该存储在哪个数据节点上。如果集群中配置了Ingest节点,那么协调节点会将写入请求转发给Ingest节点进行数据的预处理。Ingest节点会执行管道中定义的操作,如数据转换、过滤、标准化等,然后将处理后的数据发送给相应的数据节点进行存储。
一旦数据节点接收到处理后的数据,它们将负责将数据存储到正确的分片和副本分片中。每个分片都存储着索引的一部分数据。当所有分片和副本分片都成功存储数据后,协调节点将返回成功的响应给客户端。
当一个查询请求到达协调节点时,协调节点会将请求发送到所有的数据节点上,并行进行查询操作。每个数据节点只负责查询自己所存储的分片数据,并返回查询结果给协调节点。协调节点会收集并合并所有数据节点的查询结果,然后进行归总和排序处理,最终将结果返回给客户端。
这种并行查询的方式可以提高查询的速度和性能,特别是在处理大量数据和复杂查询的情况下。同时,由于数据节点负责存储分片数据,可以将查询任务分配给不同的数据节点,从而实现负载均衡和分布式处理。这样的设计使得Elasticsearch能够快速响应查询请求,并处理大规模的数据。
在JVM层面,确保将最大堆和最小堆内存设置为适当的大小,以充分利用系统的资源和处理能力。
在分片方面,确保合理的分片布局和数量。主分片和副本分片应该在同一个机房,以减少网络延迟。增加主分片的数量可以提高查询的并发性能。此外,使用SSD硬盘可以提高数据的读写速度。
在架构设计方面,确保在部署ES集群时提前设计好节点的身份,可以针对不同的节点进行专门的配置。主节点可以使用较低配置的硬件,主要负责集群状态的管理。数据节点需要提供较好的存储硬盘和内存,以存储和处理数据。协调节点需要提供大内存,以处理查询请求和汇总结果。如果需要处理写入请求的预处理,可以配置Ingest节点,实现读写分离,提高系统的性能和可扩展性。
在本次面试文章中,我们讨论了以下几个问题:
希望这些总结可以帮助你们顺利进行面试
手机扫一扫
移动阅读更方便
你可能感兴趣的文章