一、索引
简单来说:正向索引是通过key找value,反向索引则是通过value找key
1、正向索引
是什么
以ID为主键,通过ID快速检索到对应的数据或者信息
优缺点
优点:新增数据时,直接存储到数据库中并按照lD创建索引删除数据时,直接删除数据即可,然后将ID对应的索引移除。综上所述:数据的新增和删除时与其他行的数据关联很小
缺点:针对于非主健的列进行查询,效率比较低,比如说一些模糊查询 like %yjx%
2、反向索引(也叫倒排索引)
是什么
以字或者词为主键,然后记录这个字词出现在的文档以及文档的位置
优缺点
优点:基于字词为主键,查询效率特别高
缺点:倒排表的创建和维护比较复杂,使用倒排索引查询—整行数据很难
ES使用的就是反向索引
二、ES概要
1.ES是什么
Elaticsearch,简称为 ES, ES 是一个开源的高扩展的分布式全文搜索引擎, 是整个 ElasticStack 技术栈的核心。
它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。
全文搜索引擎
1、全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法。全文检索首先将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的目的。这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
2、全文检索就是把文本中的内容拆分成若干个关键词,然后根据关键词创建索引。查询时,根据关键词查询索引,最终找到包含关键词的文章。整个过程类似于查字典的过程。(重点在于如何可以正确高效的拆分关键词,然后根据关键词创建索引)
3、全文检索的应用领域:
- 搜索引擎:例如百度、谷歌、搜狗。
- 站内搜索:例如论坛搜索,天涯论坛搜索、微博搜索。
- 电商搜索:搜索的是商品信息。例如淘宝、京东。
2.ES与Lucene与Solr
1、Lucene
Lucene是apache下的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,还有就是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
2、Solr
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
3、Elasticsearch
Elasticsearch跟Solr一样,也是一个基于Lucene的全文搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。
4、Elasticsearch 与 Solr 的比较
- 二者安装都很简单;
- Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
- Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式
- Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。
3.ES的倒排索引
1、组成
- 单词词典(被分词器拆分后的单词)
- 倒排列表(单词对应的文档):为了快速定位到单词,使用B+树存储单词。由文档ID、单词频率、位置、偏移组成
2、索引的更新策略
Elasticsearch的主要应用场景就是实时,虽然Elasticsearch本身并非实时而是near-real-time(近实时)。所以搜索引擎需要处理的文档集合往往都是动态集合。
也就是说在建好初始的索引后,不断有新文档进入系统,同时原先的文档集合内有些文档可能被删除或更改。
-
完全重建策略
完全重建策略是一个很直接的方法,当新增文档达到一定数量,将新增文档和原先的老文档进行合并,然后利用建立静态索引的方式,对所有文档重新建立索引。新索引建立完成后,老的索引被遗弃释放 -
再合并策略
在合并过程中,需要依次遍历增量索引和老索引单词词典中包含的单词以及其对应的倒排列表,可以用两个指针分别指向增量索引和老索引目前需要合并的单词。 -
原地更新策略
如果老索引的倒排列表没有变化,可以不需要读取这些信息,而只是对那些倒排列表变化的单词进行处理,或者是直接将发生变化的倒排列表追加到老索引的末尾,即只更新增量索引里出现的单词相关信息,这样就可以减少大量的磁盘读写操作,提升系统执行效率。 -
混合策略
混合策略一般会将单词根据不同性质进行分类 ,不同类别单词,对其索引采取不同的索引更新策略。
三、ES结构、架构、流程
1、 ES数据存储结构
- 索引Index:索引是文档(Document)的容器,是一类文档的集合
- 文档Document: Index 里面单条的记录称为Document(文档)。等同于关系型数据库表中的行。
- 字段Field:一行数据中心包含很多的字段,类似于关系数据库的列Column
- 类型Type:8.0.0 以后完全不支持
2、ES架构
- Index:用户根据自己的需求创建的表
- Document:存储数据的时候需要按照Document进行存储
- Node:集群就是由多个Node组成,当他们启动得时候默认向核心节点汇报自己的信息,然后选举出本次的主节点
分为主节点,数据节点,协调节点
主节点:负责集群的管理
数据节点:负责集群数据的存储(比如说字典和倒排列表)
协调节点:负责处理本批次的crud - Shard:数据被保存在多个分片中,相当于水平分表,创建Index的时候分片就已经被确定了
- Replaction:分片的副本,主分片负责读写,副本分片负责读取,相同的副本分片不会存在于同—个节点中
3、ES数据的流程
1.增
宏观流程
每个Index由多个Shard组成,每个Shard有一个主节点和多个副本节点,副本个数可配。
1.写入数据的时候首先确认要写入的切片(field----mapping----id),确定主分片
2数据发送给主分片,主分片接受成功后推送给副本分片
微观流程
1.数据优先写入到内存,内存的区域叫做Segment
2.为了保证数据的安全,增加日志模块,叫做TransLog
3.先写内存后写日志,然后将日志写出到硬盘
值得注意的是hbase在操作之前先写日志,而ES先操作再写日志,ES可能会有一些错误操作,避免把错误操作写进日志里
2.删
如果是删除请求的话,提交的时候会生成一个.del文件,里面将某个doc标识为deleted状态,
那么搜索的时候根据.del文件就知道这个doc被删除了,客户端搜索的时候,发现数据在.del文件中标志为删除就不会搜索出来了
3.改
先删除再新增