什么是ES?
ES 是使用 Java 编写的一种开源搜索引擎,它在内部使用 Lucene 做索引与搜索,通过对 Lucene 的封装,隐藏了 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)
相关概念知识
以下解释仅仅为了方便理解,不代表等同。
- 分片:类似小说分章节
- Index(索引):类似关系型数据库中的数据库
- Type: 类似关系型数据库中的表。在 ES 6.x 中只允许每个 Index 中包含一个 Type。在 7.x 版本中将彻底移除 Type。
- Document(文档):是存储在Elasticsearch中的JSON文档。它就像关系数据库中表中的一行
- field:相当于列
- id:标识一个文档,必须是唯一的。如果没有提供ID,则会自动生成
- mapping:定义一个type
相关结构
ES默认会有5个分片,1个备份
数据类型
字符串类型
- text:当一个字段是要被全文搜索的,比如产品描述,应该使用text类型。text类型的字段不用于排序,很少用于聚合。
- keyword:类型适用于索引结构化的字段,比如email地址、主机名、状态码和标签。如果字段需要进行过滤、排序、聚合。keyword类型的字段只能通过精确值搜索到。
整数类型
在满足需求的情况下,尽可能选择范围小的数据类型。比如,某个字段的取值最大值不会超过100,那么选择byte类型即可。迄今为止吉尼斯记录的人类的年龄的最大值为134岁,对于年龄字段,short足矣。
字段的长度越短,索引和搜索的效率越高。
类型 | 取值范围 |
byte | -128~127 |
short | -32768~32767 |
integer | -2^31~2^31-1 |
long | -2^63~2^63-1 |
浮点类型
类型 | 取值范围 |
doule | 64位双精度IEEE 754浮点类型 |
float | 32位单精度IEEE 754浮点类型 |
half_float | 16位半精度IEEE 754浮点类型 |
scaled_float | 缩放类型的的浮点数 |
时间类型
日期将始终以字符串形式呈现,即使最初在JSON文档中提供的日期很长也是如此。 format可以是如下这种||的形式
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
布尔类型
布尔字段接受JSONtrue
和false
值,但也可以接受为 "true" 或 "false" 的字符串
范围数据类型
RestFul风格操作
GET请求:
- http://ip:port/index : 查询索引信息
- http://ip:port/index/type/doc_id : 查询指定的文档信息
POST请求:
- http://ip:port/index/type/_search : 查询文档,可以在请求体中添加json字符串来代表查询条件
- http://ip:port/index/type/doc_id/_update : 修改文档,在请求体中指定json字符串代表修改的具体信息
PUT请求:
- http://ip:port/index : 创建一个索引,需要在请求体中指定索引的信息,类型,结构
- http://ip:port/index/type/_mappings : 代表创建索引时,指定索引文档存储的属性的信息
DELETE请求:
- http://ip:port/index : 删库跑路
- http://ip:port/index/type/doc_id : 删除指定文档
倒排索引结构
如何理解倒排索引呢?假如现有三份数据文档,文档的内容如下分别是:
- Java is the best programming language.
- PHP is the best programming language.
- Javascript is the best programming language.
为了创建倒排索引,我们通过分词器将每个文档的内容域拆分成单独的词(我们称它为词条或 Term),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。
结果如下所示:
Term Doc_1 Doc_2 Doc_3 ------------------------------------- Java | X | | is | X | X | X the | X | X | X best | X | X | X programming | x | X | X language | X | X | X PHP | | X | Javascript | | | X -------------------------------------
这种结构由文档中所有不重复词的列表构成,对于其中每个词都有一个文档列表与之关联。这种由属性值来确定记录的位置的结构就是倒排索引。带有倒排索引的文件我们称为倒排文件。
我们将上面的内容转换为图的形式来说明倒排索引的结构信息,如下图所示:
其中主要有如下几个核心术语需要理解:
- 词条(Term):索引里面最小的存储和查询单元,对于英文来说是一个单词,对于中文来说一般指分词后的一个词。
- 词典(Term Dictionary):或字典,是词条 Term 的集合。搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
- 倒排表(Post list):一个文档通常由多个词组成,倒排表记录的是某个词在哪些文档里出现过以及出现的位置。每条记录称为一个倒排项(Posting)。倒排表记录的不单是文档编号,还存储了词频等信息。
- 倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件被称之为倒排文件,倒排文件是存储倒排索引的物理文件。