ElasticSearch核心基础之入门篇

一 什么是全文检索

指的是计算机搜索程序扫面整篇文档,对每一个单词建立索引,并记录该词出现的位置次数。这样当用户查询的时候,搜索程序就根据事先监理的索引进行查找,并将查找结果返回用户。

 

正排索引和倒排索引

我们知道,搜索程序可以扫描文档,对每一个单词进行    索引,这样被拆分的单词就是关键词,所以就会形成一个关键词的集合,每一个关键词都会记录它在文档中出现的位置和次数。

正排索引:forward index,就是根据文档找关键词


倒排索引:invert index,根据关键词找文档




如上图所示:Lucene将上面3列作为词典文件(Term Dictionary),频率文件(frequencies),位置文件(positions)。其中词典文件不仅保存了每一个关键词,还保留了指向频率文件和位置文件的指针,通过该指针读取关键字的频率信息和位置信息

 

从正排索引和倒排索引的特性来看,不难看出:

倒排索引:更加适合搜索,效率很快

正派索引:更加适合排序,聚合等

二 什么是ElasticSearch

是一个基于Lucene的构建的开源的,分布式的,RESTful接口全文搜索引擎,还可以把她理解为分布式的文档数据库。

2.1ElasticSearch相关的产品

Beats: 他是一个代理,将不同类型的数据发送到ElasticSearch中。它由三部分组成:Filebeat,Topbeat,Packetbeat。 其中Filebeat用于收集日志,Topbeat用来收集系统基础设置数据,如CPU,内存,每一个进程的统计信息,Packetbeat是一个网络包分析工具。

Shield: 加密通信,认证保护整个ElasticSearch数据,它是基于角色的访问控制和统计,是收费的

Watcher:它是ElasticSearch的警报和通知工具。他可以主动监测ElasticSearch的状态,并在有异常的时候进行提醒,还可以根据你的数据变化情况来才去不同的处理方式,也是收费的。

Marvel: 它是ElasticSearch的管理和监控工具。他监控ElasticSearch集群索引节点活动,快速诊断问题,也是收费的。

 

2.2 基础知识

2.2.1term 索引词

是一个能够被索引的精确值,foo,Foo,FOO几个单词是不同的索引词。索引词(term)是可以通过term查询进行准确的搜索。

2.2.2text 文本

文本是一段普通的非结构化的文字,通常文本会拆成一个个的索引词,存储在ElasticSearch的索引库中。为了让文本能够进行搜索,文本字段需要实现进行分析,当对文本中的关键词查询的时候,搜索引擎应该根据搜索条件搜出原来的文本

2.2.3 analysis分析

分析是将文本转化为索引词的过程,分析结果依赖于分词器,比如FOO BAR、Foo-Bar和 foo bar这几个单词有可能会被拆分成相同的索引词foo和bar,这些索引词存储在ElasticSearch的索引库中。

2.2.4 routing路由

当存储一个文档的时候,他会存储在一个唯一的主分片中,具体哪个分片是通过散列值进行选择。默认情况下,这个值由文档的ID生成。

2.2.5shard 分片

一个分片就是一个lucene实例,是一个最小的工作单元,存储部分数据。索引会被切分成多个分片:分片有2中类型

Primary Shard(主分片) 和 Replica Shard(备份分片):

主要目的就是为了容灾和容错,防止节点故障导致shard数据丢失当;并且副本分片还可以分担读请求。

增加节点的时候,分片会自动在节点中负载均衡

一个文档只可能存在一个主分片中,以及主分片对应的备份分片,不可能存在多个分片中

Primary Shard的数量在创建索引的时候就固定了,默认是5个;副本分片数量可以随时修改。所以默认有10个shard, 5个主分片以及他们分别对应的副本分片

主分片和部分分片不能同时存放于同一个节点上,否则节点宕机,主备分片都丢失,起不到容灾容错的作用。

2.2.6 索引

是具有相同结构的文档集合,例如一个客户信息的索引,包括一个产品目录的索引,一个订单数据的索引。在系统上索引的名字全部小写,通过这个名字可以用来执行索引,搜搜更新和删除操作。

2.2.7 类型 type

在索引中,可以定义一个或多个类型,类型是索引的逻辑分区。比如一个博客平台,把所有的数据存在索引中,这个索引你可以定义一种类型为用户数据,一种类型为博客数据,另一种类型为评论数据

2.2.8 文档 document

文档是存储在ElasticSearch中的一个JSON格式的字符串。他就像在关系型数据库中表的一行。每个存储在索引中的一个文档都有一个类型和ID,每一个文档都是一个json对象,存储0个或者多个字段或者键值对

2.2.9 映射 mapping

映射像关系型数据库中的表结构,每一个索引都有一个映射,他定义了索引中的每一个字段类型,以及一个索引范围内的设置。一个映射可以视线被定义也可以在第一次文档存储的时候被自动识别

2.2.10字段 field

文档中包含零个或者多个字段,字段可以是一个简单的值也可以是一个数组会对象的嵌套结构。字段类似于关系型数据库中表的列。每一个字段都有一个类型。