ElasticSearch新手教程

来源:互联网 发布:武汉聚友网络 编辑:程序博客网 时间:2024/06/10 03:20

一.ES原理分析
1.1 全文检索的一般过程
1.2 反向索引
1.3 和nosql相比
1.4 ES的优缺点分析:
1.5 ES的特点:
二.讲讲Segment
2.1 什么是segment
2.2 segment流程图
2.3 删除和更新
2.4 实时索引
2.5更新持久化
2.6 Segment合并
Segment
三.全文检索的基本原理
3.1 对数据分类
3.2 对全文数据的搜索方式有两种:
3.3 全文检索的底层使用倒排索引(将文档使用分词器拆分成一个关键词列表)
3.4 如何创建索引
3.5 创建索引和搜索图解
3.6计算权重的过程
四.倒排索引原理和实现
4.1 搜索引擎的底层实现是基于倒排索引
4.2 倒排索引其实就是实现“单词-文档矩阵”的具体数据结构
4.3 倒排索引主要由两个部分组成:“单词词典”和“倒排文件”
一.ES原理分析
1.1 全文检索的一般过程
下面这幅图来自《Lucene in action》,但却不仅仅描述了Lucene的检索过程,而是描述了全文检索的一般过程。

1.2 反向索引
由于从字符串到文件的映射是文件到字符串映射的反向过程,于是保存这种信息的索引称为反向索引。
1.3 和nosql相比
简单的说,对读多写少的存储es是可以代替mongo的
1.4 ES的优缺点分析:
优点:
1.数据安全性:ElasticSearch的shard支持replication,一份数据可以保存多份,如果某一台机器挂掉了,数据在其他机器上还有,不用担心丢失。
2.访问安全性:ElasticSearch支持验签,不用担心未授权的访问。
3.迁移特性:ElasticSearch支持众多的插件,在和其他开源系统之间导入,导出数据都很简单。
4.数据完整性:ElasticSearch支持保存数据原文。
缺点:
1.不支持事务
2.读写有一定延时
3.无权限管理

1.5 ES的特点:
1.高并发。实测es单机分配10g内存单实例,写入能力1200qps,60g内存、12核CPU起3个实例预计可达到6000qps。
2.同机房单条数据写入平均3ms(比mysql慢,mg不清楚)
3.容错能力比mg强。比如1主多从,主片挂了从片会自动顶上
4.满足大数据下实时读写需求,无需分库(不存在库的概念)。
5.易扩展。实例间做下配置即可扩展并发性和容积,自动分配的写入机制,无需操心传统db中多主同步的诟病
6.支持较复杂的条件查询,group by、排序都不是问题
7.具有一定的关系性,但不用担心大字段的问题

note:
elasticsearch采用广播的方式自动发现节点,需要等待一段时间才能发现新的节点:
git的镜像备份:只记录变化的文件,保存起来生成一个版本号,就可以随时切换
再来说说Shard,每个Index(对应Database)包含多个Shard,默认是5个,分散在不同的Node上,但不会存在两个相同的Shard存在一个Node上,这样就没有备份的意义了。Shard是一个最小的Lucene索引单元。
二.讲讲Segment

2.1 什么是segment
index 会分片shard, shard 会被分配到不同的节点,同时index 又是segment的集合,

2.2 segment流程图

数据生成索引存入内存Buffer,同时存入TranSlog
内存中的数据每隔一秒以segment的形式写入系统文件缓存
每隔一段时间,文件缓存中的数据存入硬盘,同时清除对应的translog
note:更新操作不会立即更新,这样会导致随机读写磁盘,效率不高
2.3 删除和更新
segments是不变的,所以文档不能从旧的segments中删除,也不能在旧的segments中更新来映射一个新的文档版本。取之的是,每一个提交点都会包含一个.del文件,列举了哪一个segmen的哪一个文档已经被删除了。 当一个文档被”删除”了,它仅仅是在.del文件里被标记了一下。被”删除”的文档依旧可以被索引到,但是它将会在最终结果返回时被移除掉。
文档的更新同理:当文档更新时,旧版本的文档将会被标记为删除,新版本的文档在新的segment中建立索引。也许新旧版本的文档都会本检索到,但是旧版本的文档会在最终结果返回时被移除。
2.4 实时索引
在上述的per-segment搜索的机制下,新的文档会在分钟级内被索引,但是还不够快。 瓶颈在磁盘。将新的segment提交到磁盘需要fsync来保障物理写入。但是fsync是很耗时的。它不能在每次文档更新时就被调用,否则性能会很低。 现在需要一种轻便的方式能使新的文档可以被索引,这就意味着不能使用fsync来保障。 在ES和物理磁盘之间是内核的文件系统缓存。之前的描述中,在内存中索引的文档会被写入到一个新的segment。但是现在我们将segment首先写入到内核的文件系统缓存,这个过程很轻量,然后再flush到磁盘,这个过程很耗时。但是一旦一个segment文件在内核的缓存中,它可以被打开被读取。
2.5更新持久化
不使用fsync将数据flush到磁盘,我们不能保障在断电后或者进程死掉后数据不丢失。ES是可靠的,它可以保障数据被持久化到磁盘。一个完全的提交会将segments写入到磁盘,并且写一个提交点,列出所有已知的segments。当ES启动或者重新打开一个index时,它会利用这个提交点来决定哪些segments属于当前的shard。 如果在提交点时,文档被修改会怎么样?
translog日志提供了一个所有还未被flush到磁盘的操作的持久化记录。当ES启动的时候,它会使用最新的commit point从磁盘恢复所有已有的segments,然后将重现所有在translog里面的操作来添加更新,这些更新发生在最新的一次commit的记录之后还未被fsync。
translog日志也可以用来提供实时的CRUD。当你试图通过文档ID来读取、更新、删除一个文档时,它会首先检查translog日志看看有没有最新的更新,然后再从响应的segment中获得文档。这意味着它每次都会对最新版本的文档做操作,并且是实时的。
2.6 Segment合并
通过每隔一秒的自动刷新机制会创建一个新的segment,用不了多久就会有很多的segment。segment会消耗系统的文件句柄,内存,CPU时钟。最重要的是,每一次请求都会依次检查所有的segment。segment越多,检索就会越慢。
ES通过在后台merge这些segment的方式解决这个问题。小的segment merge到大的,大的merge到更大的。。。
这个过程也是那些被”删除”的文档真正被清除出文件系统的过程,因为被标记为删除的文档不会被拷贝到大的segment中。
Segment
Inverted Index
Inverted Index主要包括两部分:
一个有序的数据字典Dictionary(包括单词Term和它出现的频率)。
与单词Term对应的Postings(即存在这个单词的文件)。
Stored Fields
当我们想要查找包含某个特定标题内容的文件时,Inverted Index就不能很好的解决这个问题,所以Lucene提供了另外一种数据结构Stored Fields来解决这个问题。本质上,Stored Fields是一个简单的键值对key-value。默认情况下,ElasticSearch会存储整个文件的JSON source。

三.全文检索的基本原理

3.1 对数据分类
结构化数据
非结构化数据 ,非结构化数据又一种叫法叫全文数据。
3.2 对全文数据的搜索方式有两种:
顺序扫描
所谓顺序扫描就是按顺序对所有文件以此扫描,对每个文档进行关键字匹配
全文检索
对文档首先使用分词器取出关键词,得出的关键词列表即是倒排索引,这种非结构化数据中提取出的然后重新组织的信息,我们称之索引
这种对文档先建立索引在搜索的过程,叫全文检索
3.3 全文检索的底层使用倒排索引(将文档使用分词器拆分成一个关键词列表)

3.4 如何创建索引
全文检索的索引创建过程一般有以下几步:
第一步:一些要索引的原文档(Document)。
第二步:将原文档传给分次组件(Tokenizer)。
第三步:将得到的词元(Token)传给语言处理组件(Linguistic Processor)。
第四步:将得到的词(Term)传给索引组件(Indexer)。
3.5 创建索引和搜索图解

举例说明查询索引的过程:
首先,在反向索引表中,分别找出包含lucene,learn,hadoop的文档链表。
其次,对包含lucene,learn的链表进行合并操作,得到既包含lucene又包含learn的文档链表。
然后,将此链表与hadoop的文档链表进行差操作,去除包含hadoop的文档,从而得到既包含lucene又包含learn而且不包含hadoop的文档链表。
此文档链表就是我们要找的文档。
3.6计算权重的过程
影响一个词(Term)在一篇文档中的重要性主要有两个因素:
Term Frequency (tf):即此Term在此文档中出现了多少次。tf 越大说明越重要。
Document Frequency (df):即有多少文档包含次Term。df 越大说明越不重要。

影响一个词(Term)在一篇文档中的重要性主要有两个因素:
Term Frequency (tf):即此Term在此文档中出现了多少次。tf 越大说明越重要。
Document Frequency (df):即有多少文档包含次Term。df 越大说明越不重要。
四.倒排索引原理和实现
4.1 搜索引擎的底层实现是基于倒排索引
4.2 倒排索引其实就是实现“单词-文档矩阵”的具体数据结构
可以有不同的方式来实现上述概念模型,比如“倒排索引”、“签名文件”、“后缀树”等方式。
后缀树:是一种PAT树,它描述了给定字符串的所有后缀,许多重要的字符串操作都能够在后缀树上快速地实现。https://www.cnblogs.com/luosongchao/p/3247478.html
4.3 倒排索引主要由两个部分组成:“单词词典”和“倒排文件”
单词词典(Lexicon):搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
单词词典进行构建和查找,常用的数据结构包括哈希加链表结构和树形词典结构
doc1:i am a handsome student
doc2:she is a beautiful student
单词列表
doc1
doc2
he she
is is
a a
handsome beautiful
student student
倒排索引表
单词id
单词
文档列表
1 he 1
2 she 2
3 is 1,2
4 a 1,2
5 handsome 1
6 beautiful 2
7 student 1,2

原创粉丝点击