Elasticsearch介绍及基本操作 ---- HTTP协议方式
Posted BlogGao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch介绍及基本操作 ---- HTTP协议方式相关的知识,希望对你有一定的参考价值。
Elasticsearch基本操作
文章目录
一、概述
Elasticsearch,简称为ES, 是一个开源的、高扩展的、RESTful 风格的分布式全文搜索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
这里说到的全文搜索引擎指的是目前广泛应用的主流搜索引擎,它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。
Elasticsearch 是面向文档型数据库,一条数据就是一个文档,Elasticsearch 中存储的文档数据和 mysql 存储数据的对比:
注:Elasticsearch 中 Type 的概念已经被删除了。
1.1 正排索引和倒排索引
正排索引:
MySQL中采用的是正排索引,比如根据主键索引查询某一记录中对应字段的值。但是如果模糊查询(查询某一个字段中某一部分),根据索引只能定位到完整的字段值,所以这种索引就可能会失效。
倒排索引:
ES采用的是倒排索引,对文章进行分词拆解操作,对每一个词都建立索引,根据某一个具体的词就可以查询到对应的索引值,根据这个索引值就可以查询到整个文章内容,这就是倒排索引。
二、安装程序
-
下载地址:Past Releases of Elastic Stack Software | Elastic(本文使用7.8.0版本的Win格式)
-
对压缩包进行解压,得到如下目录结构:
-
解压后,进入 bin 目录,点击 elasticsearch.bat 文件启动 ES 服务:
注意: 9300 端口为 Elasticsearch 集群间组件的通信端口, 9200 端口为浏览器访问的 HTTP 协议 RESTful 端口。
-
打开浏览器,输入网址:http://localhost:9200/,出现如下界面表示启动成功:
-
为了能够方便的使用 RESTful 风格的请求,所以安装 Postman 软件,下载地址:https://www.getpostman.com/apps
三、HTTP操作
3.1 索引操作
3.1.1 创建索引
对比关系型数据库,创建索引就相当于创建数据库。
创建索引的 PUT 请求:http://127.0.0.1:9200/索引名称
:
# 响应结果,true表示成功
"acknowledged": true,
# 分片操作成功
"shards_acknowledged": true,
# 创建的索引名称
"index": "shopping"
如果重复添加相同索引,会返回错误信息:
3.1.2 查看索引
查看所有索引:
查看所有索引的 GET 请求:http://127.0.0.1:9200/_cat/indices?v
:
- _cat:表示查看的意思
- indices:表示所有索引
- ?v:表示结果使用表格的形式展示
响应结果详细内容如下:
查看单个索引:
查看单个索引的 GET 请求:http://127.0.0.1:9200/索引名
:
对响应结果的解析:
# 索引名
shopping
# 别名
aliases
# 映射
mappings
# 设置
settings
# 设置-索引
settings-index
# 设置-索引-创建时间
settings-index-creation_date
# 设置-索引-主分片数量
settings-index-number_of_shards
# 设置-索引-副分片数量
settings-index-number_of_replicas
# 设置-索引-唯一标识
settings-index-uuid
# 设置-索引-版本
settings-index-version
# 设置-索引-名称
settings-index-provided_name
3.1.3 删除索引
删除索引的 DELETE 请求:http://127.0.0.1:9200/索引名
:
再次访问索引,响应索引不存在:
3.2 文档操作
3.2.1 创建文档
随机生成id值:
创建文档就相当于创建表的记录,这条记录的格式为 JSON 格式。
创建文档的 POST 请求为:http://127.0.0.1:9200/索引名/_doc + JSON格式请求体
:
- _doc:表示文档:
注:由于 PUT 操作是幂等的,多次发出相同的请求,后一个会把前一个覆盖掉,而创建文档返回的 _id 值是不同的,所以需要使用 POST 来创建,而 PUT 一般用来改资源。
生成固定id值:
创建文档的 POST 请求为:http://127.0.0.1:9200/索引名/_doc/id值 + JSON格式请求体
:
注:如果创建文档时明确数据主键(id)值,那么请求方式也可以使用PUT。
3.2.2 查看文档
查看文档时,需要指明文档的唯一标识,类似于 MySQL 的主键查询。
查询文档的 GET 请求:http://127.0.0.1:9200/索引名/_doc/文档主键值
:
3.2.3 修改文档
修改整个文档
修改整个文档的 POST 请求:http://127.0.0.1:9200/索引名/_doc/文档主键值 + JSON请求体
:
修改文档部分字段
修改文档部分字段的 POST 请求:http://127.0.0.1:9200/索引值/_update/文档主键值 + JSON格式请求体
:
3.2.4 删除文档
删除一个文档并不会立即从磁盘中删除,他只是被标记为已删除(逻辑删除)。
删除文档的 DELETE 请求:http://127.0.0.1:9200/索引值/_doc/文档主键值
:
3.3 多种查询方式
3.3.1 条件查询
将结果全部查询出来之后进行过滤,仅显示符合指定字段值的文档。
方式一:
发送 GET 请求:http://127.0.0.1:9200/索引值/_search?q=字段名:字段值
方式二:
发送 GET 请求:http://127.0.0.1:9200/索引值/_search + JSON格式请求体
3.3.2 全量查询
查询某一索引下的全部文档。
方式一:
发送 GET 请求:http://127.0.0.1:9200/索引名/_search
方式二:
发送 GET 请求:http://127.0.0.1:9200/索引名/_search + JSON格式请求体
3.3.3 分页查询
对查询结果进行分页操作。
分页结果:
"took": 2,
"timed_out": false,
"_shards":
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
,
"hits":
"total":
"value": 3,
"relation": "eq"
,
"max_score": null,
"hits": [
"_index": "shopping",
"_type": "_doc",
"_id": "86XdrX0BhPod2Sb5T3VE",
"_score": null,
"_source":
// 仅指定的title字段被显示出来
"title": "小米手机"
,
"sort": [
3999.0
]
,
"_index": "shopping",
"_type": "_doc",
"_id": "XndgzH0BZ5WKFcQMlsuM",
"_score": null,
"_source":
"title": "华为手机"
,
"sort": [
2503.36
]
]
3.3.4 多条件查询
情况1:且条件
情况2:或条件
3.3.5 范围查询
注意:
3.3.6 全文检索
情况一:
有时在查询时,并没有输入字段完整的值,也可以将结果查询出来,比如:
出现的原因:保存文档时,ES 会将数据文字进行分词拆解操作,并将拆解结果保存在倒排索引中,这样,即使使用文字的一部分也能将对应的结果查询出来。
情况二:
输入两个文档中不同的字段值组合结构,本身这个值不存在任何文档的字段中,但会将两篇文档全部查询出。如下:
出现的原因:ES 会将查询条件也进行分词拆解操作,分成了 “小” 和 “华” 两部分,两个字分别对应情况1(进行倒排索引的匹配),所以会将两篇文档全部查询出。
3.3.7 完全匹配
如果不想出现全文检索部分匹配的情况,而想要完全的匹配查询值,需要使用关键字 match_phrase
:
3.3.8 聚合查询
可以对查询结果进行分组、求平均值、最大值等操作。
分组操作示例:
查询结果:
"aggregations":
//自定义分组结果名称
"price_group":
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
//表示价格为2503.3的文档个数为2个
"key": 2503.3,
"doc_count": 2
,
//表示价格为3999.0的文档个数为1个
"key": 3999.0,
"doc_count": 1
]
求平均值操作示例:
请求体:
//agg表示聚合操作
"aggs" :
//自定义名称,作为结果的名称
"price_avg" :
//avg表示求平均值操作
"avg" :
//表示对所有文档的price字段求平均值
"field" : "price"
,
//仅显示平均值结果,而不显示所有的文档具体内容
"size" : 0
查询结果:
"took": 2,
"timed_out": false,
"_shards":
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
,
"hits":
"total":
"value": 3,
"relation": "eq"
,
"max_score": null,
//不显示具体的文档内容,如果不使用size=0,则这里会显示所有的文档具体内容
"hits": []
,
"aggregations":
//自定义名称
"price_avg":
//平均值结果
"value": 3001.90673828125
3.3.9 映射关系
文本类型可以进行全文检索部分匹配,而 K-V 类型只能进行完全匹配。
1. 创建user索引
http://127.0.0.1:9200/user
2. 定义字段的映射类型
发送的请求:
携带的请求体:
//设置映射关系
"properties" :
//name字段的类型是文本,而且此字段可以使用索引
"name" :
"type" : "text",
"index" : true
,
//sex字段的类型是K-V,而且此字段可以使用索引
"sex" :
"type" : "keyword",
"index" : true
,
//sex字段的类型是K-V,而且此字段不能使用索引
"tel" :
"type" : "keyword",
"index" : false
3. 创建文档
4. 查询字段值
情况一:
情况二:
情况三:
以上是关于Elasticsearch介绍及基本操作 ---- HTTP协议方式的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch:Elasticsearch中的refresh和flush操作指南