文章目录
1 前言
Elastic Stack 核心产品包括 Elasticsearch【存储数据】、Kibana【展示数据】、Beats 和 Logstash【收集与传输数据】(也称为 ELK Stack)等等。能够安全可靠地从任何来源获取任何格式的数据,然后对数据进行搜索、分析和可视化。sa
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,Elasticsearch 会集中存储您的数据,让您飞快完成搜索,微调相关性,进行强大的分析,并轻松缩放规模。
2 Elasticsearch 安装
-
下载安装包 Download Elasticsearch 下载版本7.8.0,操作系统为Windows
-
下载后解压,运行bin文件下的elasticsearch.bat命令
-
elasticsearch的服务端口为 9200 \textcolor{red}{9200} 9200 浏览器获得以下响应,服务正常启动
3 数据格式
Elasticsearch 是面向 文档型 \textcolor{red}{文档型} 文档型的存储数据库。一条数据就是一个文档。为了方便大家理解,我们将Elasticsearch里存储文档数据和关系型数据库Mysql存储数据的概念进行一个类别。索引是独立文档的集合体。类比于Mysql中的DataBase,Type类别与数据库中的表,在Elasticsearch7.X中Type的概念被删除了。每个存储的文档数据就是数据库中每行,文档中的字段信息对应着表的具体栏位。
4 倒排索引
Elasticsearch 使用一种称为 倒排索引 \textcolor{red}{倒排索引} 倒排索引的结构,它适用于快速的全文搜索。一个倒排索引由文档 中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
假设我们有两个文档,每个文档的正文字段包含如下内容:
1、The quick brown fox jumped over the lazy dog
2、Quick brown foxes leap over lazy dogs in summer
为了创建倒排索引,我们首先将每个文档的正文字段,拆分成单独的词(我们称它为词条或 Tokens),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。
词条 | 文档 |
---|---|
quick | 文档1 |
lazy | 文档1 文档2 |
brown | 文档1 文档2 |
fox | 文档1 |
leap | 文档2 |
… | … |
假如我们想想要搜索brown ,我们只需要查找包含每个词条的倒排索引
词条 | 文档 |
---|---|
brown | 文档1 文档2 |
我们可以看到两篇文档中都包含brown字条,两篇文章都被检索出来了。
默认情况下,Elasticsearch 文档每个字段都会被索引。如果某些字段不需要支持查询,可以在映射中配置 “index”: false ,减少存储空间占用,并且提升写入速度。这部分内容我将在后面为大家介绍。
5 常用HTTP请求操作Elasticsearch
5.1 创建索引
类比关系型数据库,当我们操作数据时,需要知道是针对哪一个数据库。Index相当于关系型数据库的DB,所以需要创建索引。可以发送PUT请求
h
t
t
p
:
/
/
l
o
c
a
l
h
o
s
t
:
9200
/
i
n
d
e
x
1
\textcolor{red}{ http://localhost:9200/index1}
http://localhost:9200/index1 去创建名称为Index1的索引
再次向浏览器发送该put请求时,会被告知异常
{
"error": {
"root_cause": [
{
"type": "resource_already_exists_exception",
"reason": "index [index1/naVrfF_oQ325n2p60qJCnA] already exists",
"index_uuid": "naVrfF_oQ325n2p60qJCnA",
"index": "index1"
}
],
"type": "resource_already_exists_exception",
"reason": "index [index1/naVrfF_oQ325n2p60qJCnA] already exists",
"index_uuid": "naVrfF_oQ325n2p60qJCnA",
"index": "index1"
},
"status": 400
}
5.2 查询索引信息
发送Get请求去获得指定索引信息
h
t
t
p
:
/
/
l
o
c
a
l
h
o
s
t
:
9200
/
i
n
d
e
x
1
\textcolor{red}{http://localhost:9200/index1}
http://localhost:9200/index1
5.3 删除索引
发送Delete请求去删除指定索引信息
h
t
t
p
:
/
/
l
o
c
a
l
h
o
s
t
:
9200
/
i
n
d
e
x
1
\textcolor{red}{http://localhost:9200/index1}
http://localhost:9200/index1
5.4 创建/修改文档
创建文档的操作,类似与向MySQL数据库中的表插入指定的数据信息。与之不同的是,插入的是文档数据,传递请求的中请求体为Json数据
发送Post请求去创建文档数据
h
t
t
p
:
/
/
l
o
c
a
l
h
o
s
t
:
9200
/
i
n
d
e
x
1
/
d
o
c
\textcolor{red}{http://localhost:9200/index1/_doc}
http://localhost:9200/index1/doc
index1 指定的文档请求
_doc 文档操作
创建文档成功后可以返回一个标识文档信息的唯一id。当创建时不指定id时将会随机生成一个字符串。也可以在创建文档时指定文档的唯一标识。可以发送Put请求去创建文档数据
h
t
t
p
:
/
/
l
o
c
a
l
h
o
s
t
:
9200
/
i
n
d
e
x
1
/
d
o
c
/
101
\textcolor{red}{http://localhost:9200/index1/_doc/101}
http://localhost:9200/index1/doc/101 ,指定id为101
PUT 和 POST 请求的区别:
- POST理解为新增或更新,PUT理解为更新。因此,在PUT中需要指定id。而POST的话,不指定id(ES会自动生成文档id),指定id(有则修改,无则创建)。
- PUT会将新的json值完全替换掉旧的;而POST方式不传 _update 参数新的json值完全替换掉旧的,带_update 参数可以更新相同字段的值,其他数据不会改变,新提交的字段若不存在则增加。
- PUT操作是幂等的,POST操作不是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有什么不同,当我们多次发出同样的POST请求后,其结果是创建了若干的资源【不指定文档id的情形】。
再次向Elasticsearch服务器发送Put请求时,将会是一个修改文档的请求
5.5查找文档
根据文档
i
d
查询指定的文档数据
h
t
t
p
:
/
/
l
o
c
a
l
h
o
s
t
:
9200
/
i
n
d
e
x
1
/
d
o
c
/
1001
\textcolor{red}{根据文档id查询指定的文档数据http://localhost:9200/index1/_doc/1001}
根据文档id查询指定的文档数据http://localhost:9200/index1/doc/1001
这里示例查询文档id为1001的文档信息
5.6局部修改文档
文档的修改分为局部的修改数据和完全覆盖两种模式,完全覆盖修改的方式之前在使用PUT接口和POST接口 【携带id】 http://localhost:9200/index1/_doc/101已经介绍。
局部修改可以发送Post
h
t
t
p
:
/
/
l
o
c
a
l
h
o
s
t
:
9200
/
i
n
d
e
x
1
/
u
p
d
a
t
e
/
101
\textcolor{red}{http://localhost:9200/index1/_update/101 }
http://localhost:9200/index1/update/101 _update 文档修改操作
5.7删除文档
根据文档id 删除指定的文档数据,发送Delete请求
h
t
t
p
:
/
/
l
o
c
a
l
h
o
s
t
:
9200
/
i
n
d
e
x
1
/
d
o
c
/
101
\textcolor{red}{http://localhost:9200/index1/_doc/101 }
http://localhost:9200/index1/doc/101
5.8分页查询
Post请求 h t t p : / / l o c a l h o s t : 9200 / i n d e x 1 / s e a r c h \textcolor{red}{ http://localhost:9200/index1/_search } http://localhost:9200/index1/search _search 文档搜索