一、ElasticSearch简介
ElasticSearch是一个分布式、RESTful风格的搜索和数据分析引擎,能够结果不断涌现出的各种用例。作为Elastic Stack的核心,它集中存储数据、帮助您发现意料之中及意料之外的情况。
二、全文检索
全文检索是指计算机程序通过扫描文章中的每一个词,对必要的词建立一个索引,指明该词在文章中出现的次数和位置。当用户查询时根据建立的索引查找,类似于通过字典的检索查找汉字的过程。
全面、准确和快速时衡量全文检索系统的关键指标。
关于全文检索工具,我们要知道:
只处理文本
不处理语义
结果列表有相关度排序
可以对关键字予以高亮显示
可以根据输入给出建议关键字
(一)正排索引
正排索引是指以文档ID为key,表中记录每个关键词出现的次数,查找时扫描表中的每个文档中字的信息,直到找到所有包含查询关键字的文档,类似mysql表数据的存储形式,每一行都有一个主键,通过主键与数据进行关联。正排索引会记录每个文章中每个单词出现的次数,每个词在文章中出现的位置。正排索引时以文档ID作为索引,但是在搜索的时候基本上都是使用关键词搜索,索引在搜索过程中会把所有文档都扫描一遍,找出其中包含由关键词的文档,然后再进行排序等其它操作,查询效率非常低。
此时如果要搜索文档内容包含有“疫情”的数据
select * from table where content like '%疫情%',这种查询效率非常低。
(二)倒排索引
倒排索引是以关键词作为索引,同时记录了这个关键词所出现的文档ID和这个关键词在文档中出现的次数、位置信息。根据关键词快速获取包含这个关键词的文档列表
倒排索引由单词字典、倒排文件组成。
单词词典:文档集合中所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
倒排列表:倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
倒排文件:存储倒排索引的物理文件,所有单词倒排列表顺序存储在磁盘的某个文件里。
简单的倒排索引
在此倒排索引中只记录了包含某个单词的文档列表及在文档中出现的次数,实际的倒排索引中还包含有,单词在文档中出现的位置信息。
三、名词术语
3.1索引(index)
- 一个索引就是一个拥有几分相似特征的文档的集合,比如说,新闻的索引可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引
- 一个索引由一个名字来标识(必须全部是小写字母),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字
- 在一个集群中,可以定义任意多的索引,能搜索的数据必须索引,这样的好处是可以提高查询速度,比如:新华字典前面的目录就是索引的意思,目录可以提高查询速度
- Elasticsearch索引的精髓:一切设计都是为了提高搜索的性能
3.2文档(document)
一个文档是一个可被索引的基础信息单元,类似与mysql中的一行数据,文档以JSON(Javascript Object Notation)格式来表示。
3.3字段(field)
相当于是数据表的字段,对文档数据根据不同属性进行的分类标识
3.4映射(mapping)
mapping是处理数据的方式和规则方面做一些限制,如:某个字段的数据类型、默认值、分析器、是否被索引等等,类似与数据库中每个字段的类型
3.5索引词
在 Elasticsearch中索引词(term)是一个能够被索引的精确值
3.6文本
- 文本是一段普通的非结构化文字,相当于原始数据
- 通常文本会被分析成一个个的索引词,存储在 Elasticsearch的索引库中
- 为了让文本能够进行搜索,文本字段需要事先进行分析
- 当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文本
3.7分析
analysis(只是一个概念),文本分析是将全文本转换为一系列单词的过程,也叫分词。analysis是通过analyzer分词器来实现的,可以使用Elasticsearch内置的分词器,也可以自己去制定一些分词器。除了在数据写入的时候将词条进行转换,在查询的时候也可以指定分词器对语句进行分析。
3.8集群
- 集群由一个或多个节点组成,对外提供服务
- 在所有节点,一个集群有一个唯一的名称,此名称很重要,因为每个节点只能是集群的一部分,当该节点被设置为相同的集群名称时,就会自动加入集群
- 当需要有多个集群的时候,要确保每个集群的名称不能重复,否则,节点可能会加入错误的集群
- 请注意,一个节点只能加入一个集群。此外,还可以拥有多个独立的集群,每个集群都有其不同的集群名称。
3.9节点
- 一个节点是一个逻辑上独立的服务,它是集群的一部分,可以存储数据,并参与集群的索引和搜索功能。就像集群一样,节点也有唯一的名字,在启动的时候分配。如果你不想要默认名称,你可以定义任何你想要的节点名
- 这个名字在管理中很重要,在网络中 Elasticsearch集群通过节点名称进行管理和通信
- 一个节点可以被配置加入一个特定的集群。
- 当网络没有集群运行的时候,只要启动任何一个节点,这个节点会默认生成一个新的集群,这个集群会有一个节点
3.10分片
- 分片数据存储的逻辑单元
- 索引是指向主分片和副本分片的逻辑空间,对于使用,只需要指定分片的数量,其他不需要做过多的事情
- 在开发使用的过程中,我们对应的对象都是索引,Elasticsearch会自动管理集群中所有的分片,当发生故障的时候,Elasticsearch 会把分片移动到不同的节点或者添加新的节点
- 一个索引可以存储很大的数据,这些空间可以超过一个节点的物理存储的限制。例如,十亿个文档占用磁盘空间为 1TB,仅从单个节点搜索可能会很慢,一台机器也不一定能存储这么多的数据,为了解决这一问题,Elasticsearch将索引分解成多个分片,当创建一个索引,可以简单地定义想要的分片数量
- 每个分片本身是一个全功能的、独立的单元,可以托管在集群中的任何节点
3.12主分片
- 每个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后会复制到不同的副本中
- 可以事先制定分片的数量,当分片一旦建立,则分片的数量不能修改
3.13副本分片
- 每一个分片有零个或多个副本,副本主要是主分片的复制
- 高可用性:当主分片失败的时候,可以从副本分片中选择一个作为主分片
- 提高性能:当查询的时候可以到主分片或者副本分片中进行查询
- 默认情况下,一个主分片配有一个副本,但副本的数量可以在后面动态地配置增加
- 副本分片必须部署在不同的节点上,不能部署在和主分片相同的节点上
四、MySql与elasticsearch对比
Mysql |
ElasticSearch |
table |
index |
row |
document |
column |
field |
schema |
mapping |
index |
everything is indexed |
sql |
query dsl |
select * from table |
get http:// |
update table set |
post http:// put http:// |
group by / avg / sum |
aggregations |
去重 distinct |
cardinality |
数据迁移 |
reindex |