一、 什么是ElasticSearch
Elasticsearch 是一个基于Lucene的分布式搜索引擎,提供搜集、分析、存储数据三大功
能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,
restful 风格接口,多数据源,自动搜索负载等。广泛应用于全文搜索、日志分析和实时数据分析等领域。
重点词汇:
分析: 可以进行文档的多种聚合、统计分析功能。
restful 风格接口: 搜集,分析,查询都提供了restful风格的接口, 用户调用restful接口完成与Elasticearch的几乎所有的操作。
主要特点:
1.实时分析
2.分布式实时文件存储,并将每一个字段都编入索引
3.文档导向,所有的对象全部是文档
4.高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards 和 Replicas)接口友好,支持 JSON
二、倒排索引
倒排索引是ElasticSearch引擎的核心数据结构,其主要作用是从文档中提取关键词,并建立关键词到文档的映射关系。这种结构与传统的正排索引(即文档到关键词的映射)相反,因此称为倒排索引。
在倒排索引中,每个关键词都关联着包含该关键词的文档列表,这使得搜索操作能够迅速定位包含特定关键词的文档,从而大幅提高查询效率。
通俗点解释就是:
倒排索引就是,将文档中包含的关键字全部提取处理,然后再将关键字和文档之间的对应关系保存起来,最后再对关键字本身做索引排序。用户在检索某一个关键字是,先对关键字的索引进行查找,再通过关键字与文档的对应关系找到所在文档。
举例说明:
现在要把下面几首诗词录入es中:
蜀道难(唐)李白
蜀道之难难于上青天,侧身西望长咨嗟。
静夜思(唐)李白
举头望明月,低头思故乡。
春台望(唐)李隆基
暇景属三春,高台聊四望。 鹤冲天(宋)柳永 黄金榜上,偶失龙头望。明代暂遗贤,如何向?未遂风云便, 争不恣狂荡。何须论得丧?才子词人,自是白衣卿相。烟花巷陌,依约丹青屏障。幸有意中人,堪寻访。且恁偎红翠,风流事,平生畅。青春都一饷。忍把浮名, 换了浅斟低唱!
上面几首诗词的"望"字和"上"字,倒排索引会这样存:
序号 | 关键字 | 蜀道难 | 静夜思 | 春台望 | 鹤冲天 |
---|---|---|---|---|---|
1 | 望 | 有 | 有 | 有 | 有 |
2 | 上 | 有 | 有 |
这就是倒排索引的存储方式。所谓的正排索引,就是记录每首诗词中每个字都有哪些。
三、 基础概念
es中有索引、文档、映射、映射类型、文档字段概念,为了方便理解,可以和关系数据库中的相关概念进行个比对:
关系数据库 | ES |
---|---|
库 | 索引(Index) |
表 | 映射类型(Mapping Type) |
数据行 | 文档(Document) |
字段 | 文档字段(Field) |
字段类型 | 映射(Mapping) |
需要注意的是,es中的映射类型(Mapping Type)在es7中已经废弃。每个索引下只有一个_doc的映射类型。
下面详细解释每个概念。
索引:
Elasticsearch 索引是映射类型的容器。一个 Elasticsearch 索引非常像关系型
世界的数据库,是独立的大量文档集合。
当然在底层,肯定用到了倒排索引,最基本的结构就是“keyword”和“Posting List”,Posting list 就是一个 int 的数组,存储了所有符合某个 term 的文档 id。
另外,这个倒排索引相比特定词项出现过的文档列表,会包含更多其它信息。它会保存每一个词项出现过的文档总数, 在对应的文档中一个具体词项出现的总次数,词项在文档中的顺序,每个文档的长度,所有文档的平均长度等等相关信息。
文档 (Document)
文档是 es 中所有可搜索数据的最小单位,比如日志文件中的日志项、一部电影的具体信息等等。
文档会被序列化 JSON 格式保存到 ElasticSearch 中,JSON 对象由字段组成,每个字段都有对象的字段类型(字符串,数值,布尔,日期,二进制,范围类型)。同时每个文档都有一个 Unique ID,可以自己指定 ID,或者通过 ElasticSearch 自动生成。所以严格来说,es 中存储的文档是一种半结构化的数据。
映射
映射(mapping)定义了每个字段的类型、字段所使用的分词器等。
可以显式映射,由我们在索引映射中进行预先定义;也可以动态映射,在添加文档的时候,由 es 自动添加到索引,这个过程不需要事先在索引进行字段数据类型匹配等等,es 会自己推断数据类型。
四、 数据类型
4.1 字符串类型
字符串类还可被分为 text 和 keyword 类型,如果我们让 es 自动映射数据,那么 es 会把字符串定义为 text,并且还加了一个 keyword类型字段。
text 文本数据类型,用于索引全文值的字段。使用文本数据类型的字段,它们会被分词,在索引之前将字符串转换为单个术语的列表(倒排索引),分词过程允许 ES 搜索每个全文字段中的单个单词。
text适用场景:只要不具备唯一性的字符串一般都可以使用 text。
keyword,关键字数据类型,用于索引结构化内容的字段。使用 keyword 类型的字段,其不会被分析,给什么值就原封不动地按照这个值索引,所以关键字字段只能按其确切值进行搜索。
keyword适用场景:具有唯一性的字符串,例如:电子邮件地址、MAC 地址、身份证号、状态代码…等等。
此外,text和keyword的另一个区别是,text类型存储数据没有长度大小限制,而keyword类型存储数据有长度限制。所以在存储超大字段时,需要设置成text类型。
4.2 数组类型
不需要特殊配置,一个字段如果被配置为基本数据类型,就是天生持数组类型的。任何字段都可以有 0 个或多个值,但是在一个数组中数据类型必须一样。
4.3 对象类型
JSON 文档是有层次结构的,一个文档可能包含其他文档,如果一个文档包含其他文档,那么该文档值是对象类型,其数据类型是对象。当然 ElasticSearch中是没有所谓对象类型的,比如:
put /open-soft/_doc/object
{
"name": ["Apache ShardingSphere"],
"lang": "Java",
"corp": "JingDong",
"stars":400,
"address":{ "city":"BeiJing", "country":"亦庄"}
}
存入es后的结构是:
4.4 日期类型
在 JSON 文档中,日期表示为字符串。Elasticsearch 使用一组预先配置的格式来识别和解析这些字符串,并将其解析为 long 类型的数值(毫秒),支持自定义格式,也有内置格式。
比如:
PUT my_index
{ "mappings":
{ "_doc":
{ "properties":
{ "date":
{ "type": "date", "format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
}