elasticsearch入门
elasticsearch入门
Elasticsearch是一个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。
Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单
安装见 elasticsearch安装
ES核心概念
Cluster:集群。
ES可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。
Node:节点。
形成集群的每个服务器称为节点。
Shard:分片。
当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片。每个分片放到不同的服务器上。
当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的。
Replia:副本。
为提高查询吞吐量或实现高可用性,可以使用分片副本。
副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。
当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。
副本是乘法,越多越浪费,但也越保险。分片是除法,分片越多,单分片数据就越少也越分散。
全文检索。
全文检索就是对一篇文章进行索引,可以根据关键字搜索,类似于mysql里的like语句。
全文索引就是把内容根据词的意义进行分词,然后分别创建索引。
elasticsearch主要概念
mapping: Mapping定义索引下字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。mapping中字段类型设置比较特殊的是字符串类型分为两类text (分词,不能排序和聚合)和 keyword(不分词,可以排序聚合)。
Index(索引) 很多人喜欢将index对比成数据库中的库,但在7.0版本后删除了type概念后 我更喜欢将index对比成数据库中的表。
Type(类型) 7.0版本后已删除,早期版本很多人喜欢将type对比数据库中的表,这其实是很不准确的,因为数据库的每个表都是相对独立的,而type不一样,elasticsearch是基于Lucene开发的搜索引擎,而ES中不同type下名称相同的filed最终在Lucene中的处理方式是一样的。也就是说不同type下的相同名的field最终在底层lucene中是被当成一列来处理的。
除此之外,在同一个索引的不同type下存储字段数不一样的实体会导致存储中出现稀疏数据,影响Lucene压缩文档的能力,导致ES查询效率的降低。
所以官方也在7.0版本号删除了这个概念。
Documents(文档) 每一行数据
Fields(属性)。每一列属性
分词
中文分词指的是将一个汉字序列切分为一个一个的单独的词。在英文中,单词之间以空格作为自然分界词,汉语中词没有一个形式上的分界符上下文不同,分词结果迥异。
ES默认对中文分词是一个一个字来解析,这种情况会导致解析过于复杂,效率低下,所以目前有几个开源的中文分词器,来专门解决中文分词,其中常用的叫IK。
IK:实现中英文单词的切分,可自定义词库,支持热更新分词词典
ik两种分词模式分为ik_max_word 和 ik_smart
- ik_max_word:会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
- ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。
两种模式根据实际情况选择,切分词后还要根据项目实际情况对分词器做详细优化。
查询流程
es的分布式search的查询流程分为query和fetch两个阶段,在query阶段会从所有的shard上读取相关document的docId及相关的排序字段值,并最终在coordinating节点上收集所有的结果数进入一个全局的排序列表后,然后获取根据from+size指定page页的数据,获取这些docId后再构建一个multi-get请求发送相关的shard上从_source里面获取需要加载的数据,最终再返回给client端,至此整个search请求流程执行完毕
分页
from/size的原理:
因为es是基于分片的,假设有5个分片,from=100,size=10。则会根据排序规则从5个分片中各取回110条数据数据,然后汇总成550条数据后选择最后面的10条数据。
做过测试,越往后的分页,执行的效率越低。总体上会随着from的增加,消耗时间也会增加。而且数据量越大,就越明显!
Elasticsearch 三种分页方式
Elasticsearch索引原理
更多推荐
所有评论(0)