Elasticsearch - HTTP操作索引,文档,映射;高级搜索(五)
阅读本文前可先参考
https://blog.csdn.net/MinggeQingchun/article/details/126618387
https://blog.csdn.net/MinggeQingchun/article/details/126624187
HTTP操作
(一)索引操作
1、创建索引
对比关系型数据库,创建索引就等同于创建数据库
在 Postman 中,向 ES 服务器发 PUT 请求 :http://127.0.0.1:9200/shop
请求响应返回结果如下:
{"acknowledged": true, //相应结果,true表示操作成功"shards_acknowledged": true, //分片结果,true表示分片成功"index": "shop" //索引名称
}
注:
创建索引库的分片数默认 1 片,在 7.0.0 之前的 Elasticsearch 版本中,默认 5 片
重复添加会报错如下:
"reason": "index [shop/oyqqKpMbRgOozeXdXpwjXA] already exists",
2、查看所有索引
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/_cat/indices?v
请求路径中的_cat 表示查看的意思,indices 表示索引
整体含义就是查看当前 ES 服务器中的所有索引,类似 MySQL 中的 show tables
字段
|
说明 |
health
|
当前服务器健康状态:
green ( 集群完整 ) yellow ( 单点正常、集群不完整 ) red ( 单点不正常 )
|
status
|
索引打开、关闭状态
|
index
|
索引名
|
uuid
|
索引统一编号
|
pri
|
主分片数量
|
rep
|
副本数量
|
docs.count
|
可用文档数量
|
docs.deleted
|
文档删除状态(逻辑删除)
|
store.size
|
主分片和副分片整体占空间大小
|
pri.store.size
|
主分片占空间大小
|
3、查看单个索引
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/shop
{"shop": { //索引名称"aliases": {}, //别名"mappings": {}, //映射"settings": { //设置"index": { //设置-索引"routing": { "allocation": { "include": { "_tier_preference": "data_content"}}}, "number_of_shards": "1", //设置-索引-主分片数量"provided_name": "shop", //设置-索引-名称"creation_date": "1661933272199", //设置-索引-创建时间"number_of_replicas": "1", //设置-索引-副分片数量"uuid": "oyqqKpMbRgOozeXdXpwjXA", //设置-索引-唯一标识"version": { //设置-索引-版本"created": "7160099"}}}}
}
4、删除索引
在 Postman 中,向 ES 服务器发 DELETE 请求 :http://127.0.0.1:9200/shop
再重新访问,索引不存在
(二)文档操作
1、创建文档
文档类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式
在 Postman 中,向 ES 服务器发 POST 请求 :http://127.0.0.1:9200/shopping/_doc
请求体内容JSON格式
{"title":"小米手机","category":"小米","images":"http://www.gulixueyuan.com/xm.jpg","price":1999.00
}
{"_index": "shopping", //索引"_type": "_doc", //类型-文档"_id": "78wa84IBgjv8XSc-HtQq", //唯一标识-类似mysql中的主键,随机生成"_version": 1, //版本"result": "created", //索引结果,true表示创建成功"_shards": { //分片"total": 2, //分片-总数"successful": 1, //分片成功"failed": 0 //分片失败},"_seq_no": 0,"_primary_term": 1
}
由于没有指定数据唯一性标识(ID),默认情况下,ES 服务器会随机生成一个
如果想要自定义唯一性标识,需要在创建时指定:http://127.0.0.1:9200/shopping/_doc/1
注:
此处发送请求的方式必须为 POST,不能是 PUT,否则会发生错误
2、查看文档
查看文档时,需要指明文档的唯一性标识,类似于 MySQL 中数据的主键查询
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/shopping/_doc/1
{"_index": "shopping", //索引"_type": "_doc", //类型-文档"_id": "1","_version": 2,"_seq_no": 2,"_primary_term": 1,"found": true, //查询结果,true表示查找到,false表示未查找到"_source": { //文档源信息"title": "小米手机","category": "小米","images": "http://www.gulixueyuan.com/xm.jpg","price": 1999.00}
}
3、修改文档
输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖
在 Postman 中,向 ES 服务器发 POST 请求 :http://127.0.0.1:9200/shopping/_doc/1
{"title":"小米手机11","category":"小米","images":"http://www.gulixueyuan.com/xm.jpg","price":1999.00
}
4、修改字段
修改一条数据的局部信息
在 Postman 中,向 ES 服务器发 POST 请求 :http://127.0.0.1:9200/shopping/_update/1
{ "doc": {"price":3000.00}
}
5、删除文档
删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)
在 Postman 中,向 ES 服务器发 DELETE 请求 :http://127.0.0.1:9200/shopping/_doc/1
此时再查找显示找不到
如果删除一个不存在的文档
6、条件删除文档
一般删除数据都是根据文档的唯一性标识进行删除,实际操作时,也可以根据条件对多条数进行删除
ES 服务器发 POST 请求 :http://127.0.0.1:9200/shopping/_delete_by_query
{"query":{"match":{"price":4000.00}}
}
(三)映射操作
映射mapping,类似于关系数据库(database)中的表结构(table)
创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型 下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)
1、创建映射
在 Postman 中,向 ES 服务器发 PUT 请求 :http://127.0.0.1:9200/student/_mapping
请求体内容
{"properties": {"name":{"type": "text","index": true},"sex":{"type": "text","index": false},"age":{"type": "long","index": false}}
}
映射数据:
1、字段名:任意填写,如:title、images、price
2、type:类型,Elasticsearch 中支持的数据类型非常丰富,列举关键数据类型如下:
(1)String 类型,又分两种:
text:可分词
keyword:不可分词,数据会作为完整字段进行匹配
(2)Numerical:数值类型,分两类
基本数据类型:long、integer、short、byte、double、float、half_float
浮点数的高精度类型:scaled_float
(3)Date:日期类型
(4)Array:数组类型
(5)Object:对象
3、index:是否索引,默认为 true,不进行任何配置,所有字段都会被索引
true:字段会被索引,则可以用来进行搜索
false:字段不会被索引,不能用来搜索
4、store:是否将数据进行独立存储,默认为 false
原始的文本会存储在_source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source 里面提取出来的
也可以独立的存储某个字段,只要设置"store": true 即可,获取独立存储的字段要比从_source 中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置
2、查看映射
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_mapping
3、索引映射关联
在 Postman 中,向 ES 服务器发 PUT 请求 :http://127.0.0.1:9200/student1
请求体
{"settings": {},"mappings": {"properties": {"name":{"type": "text","index": true},"sex":{"type": "text","index": false},"age":{"type": "long","index": false}}}
}
(四)高级查询
首先创建数据
# POST http://127.0.0.1:9200/student/_doc/1001
{
"name":"zhangsan",
"nickname":"zhangsan","sex":"男","age":30
}
# POST http://127.0.0.1:9200/student/_doc/1002
{
"name":"lisi",
"nickname":"lisi","sex":"男","age":20
}
# POST http://127.0.0.1:9200/student/_doc/1003
{
"name":"wangwu","nickname":"wangwu","sex":"女","age":40
}
# POST http://127.0.0.1:9200/student/_doc/1004
{
"name":"zhangsan1",
"nickname":"zhangsan1","sex":"女","age":50
}
# POST http://127.0.0.1:9200/student/_doc/1005
{
"name":"zhangsan2",
"nickname":"zhangsan2","sex":"女","age":30
}
1、查询所有文档
match_all 字段,在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
"query":这里的 query 代表一个查询对象,里面可以有不同的查询属性
"match_all":查询类型,例如:match_all(代表查询所有), match,term , range 等等
{"query": {"match_all": {}}
}
{"took": 5, //查询花费时间,单位毫秒"timed_out": false, //是否超时"_shards": { //分片信息"total": 1, 总数"successful": 1, 成功"skipped": 0, 忽略"failed": 0 失败},"hits": { 搜索命中结果"total": { 搜索条件匹配的文档总数"value": 4, 总计数值"relation": "eq" 技术规则:eq表示计数准确;gte表示计数不准确},"max_score": 1.0, 匹配度分值"hits": [ 命中结果集合{"_index": "student","_type": "_doc","_id": "1001","_score": 1.0,"_source": {"name": "zhangsan","nickname": "zhangsan","sex": "男","age": 30}},......]}
}
2、匹配查询
match 匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"query": {"match": {"name":"zhangsan"}}
}
3、字段匹配查询
multi_match 与 match 类似,不同的是它可以在多个字段中查询
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"query": {"multi_match": {"query": "zhangsan","fields": ["name","nickname"]}} }
4、关键字精确查询
term 查询,精确的关键词匹配查询,不对查询条件进行分词
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"query": {"term": {"name": {"value": "zhangsan"}}} }
5、多关键字精确查询
terms 查询和 term 查询一样,它允许指定多值进行匹配
如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于 mysql 的 in
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"query": {"terms": {"name": ["zhangsan","lisi"]}} }
6、指定查询字段
默认情况下,Elasticsearch 在搜索的结果中,会把文档中保存在_source 的所有字段都返回
如果只想获取其中的部分字段,可以添加_source 的过滤
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"_source": ["name","nickname"], "query": {"terms": {"nickname": ["zhangsan"]}} }
7、过滤字段
includes:来指定想要显示的字段
excludes:来指定不想要显示的字段
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"_source": {"includes": ["name","nickname"]}, "query": {"terms": {"nickname": ["zhangsan"]}} }
8、组合查询
bool`把各种其它通过`must`(必须 )、`must_not`(必须不)、`should`(应该)的查询方式进行组合
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"query": {"bool": {"must": [{"match": {"name": "zhangsan"}}],"must_not": [{"match": {"age": 30}}],"should": [{"match": {"sex": "男"}}]}} }
9、范围查询
range 查询找出那些落在指定区间内的数字或者时间。range 查询允许以下字符
操作符 | 解释说明 |
gt | 大于> |
gte | 大于等于>= |
lt | 小于< |
lte | 小于等于<= |
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"query": {"range": {"age": {"gte": 30,"lte": 35}}}
}
10、模糊查询
返回包含与搜索字词相似的字词的文档
编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括:
更改字符(box → fox)
删除字符(black → lack)
插入字符(sic → sick)
转置两个相邻字符(act → cat)
为了找到相似的术语,fuzzy 查询会在指定的编辑距离内创建一组搜索词的所有可能的变体或扩展。然后查询返回每个扩展的完全匹配。
通过 fuzziness 修改编辑距离。一般使用默认值 AUTO,根据术语的长度生成编辑距离。
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"query": {"fuzzy": {"name": {"value": "zhangsan"}}} }
{"query": {"fuzzy": {"name": {"value": "zhangsan","fuzziness": 2}}} }
11、单字段排序
sort 可以让我们按照不同的字段进行排序,并且通过 order 指定排序的方式。desc 降序,asc升序
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"query": {"match": {"name":"zhangsan"}},"sort": [{"age": {"order":"desc"}}]
}
12、多字段排序
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"query": {"match_all": {}},"sort": [{"age": {"order": "desc"}},{"_score":{"order": "desc"}}]
}
13、高亮查询
Elasticsearch 可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。
在使用 match 查询的同时,加上一个 highlight 属性:
pre_tags:前置标签
post_tags:后置标签
fields:需要高亮的字段
title:这里声明 title 字段需要高亮,后面可以为这个字段设置特有配置,也可以空
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"query": {"match": {"name": "zhangsan"}},"highlight": {"pre_tags": "<font color='red'>","post_tags": "</font>","fields": {"name": {}}}
}
14、分页查询
from:当前页的起始索引,默认从 0 开始。 from = (pageNum - 1) * size
size:每页显示多少条
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"query":{"match_all":{}},"sort":[{"age":{"order":"desc"}}],"from":0,"size":2
}
15、聚合查询
聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by
(1)对某字段取最大值max
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"aggs":{"max_age":{"max":{"field":"age"}}},"size":0
}
(2)对某字段取最小值min
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"aggs":{"min_age":{"min":{"field":"age"}}},"size":0
}
(3)对某字段求和sum
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"aggs":{"sum_age":{"sum":{"field":"age"}}},"size":0
}
(4)对某字段求平均值avg
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"aggs":{"avg_age":{"avg":{"field":"age"}}},"size":0
}
(5)对某个字段的值进行去重之后再取总数
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"aggs":{"distinct_age":{"cardinality":{"field":"age"}}},"size":0
}
(6)State 聚合
stats 聚合,对某个字段一次性返回 count,max,min,avg 和 sum 五个指标
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"aggs":{"stats_age":{"stats":{"field":"age"}}},"size":0
}
16、 桶聚合查询
桶聚和相当于 sql 中的 group by 语句
(1)terms聚合,分组统计
在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{"aggs":{"age_groupby":{"terms":{"field":"age"}}},"size":0
}
(2)terms分组,再聚合
{"aggs":{"age_groupby":{"terms":{"field":"age"},"aggs":{"sum_age":{"sum":{"field":"age"}}}}},"size":0
}
Elasticsearch - HTTP操作索引,文档,映射;高级搜索(五)相关推荐
- 【Elasticsearch】java 操作 Elasticsearch 7.8 索引 文档 等操作
本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载.有问题可以先私聊我,本人每天都在线,会帮助需要的人. 文章目录 1.概述 2. 案例 2.1 引入依赖 2 ...
- 分布式搜索elasticsearch 索引文档的增删改查 入门
分布式搜索elasticsearch 索引文档的增删改查 入门 1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful ...
- (八)ElasticSearch之文档映射
文章目录 一. 文档映射的原理 二. 映射的分类 2.1 动态映射 2.2 静态映射 三. ES类型支持 3.1 基本类型 3.2 复杂类型 3.2.1 地理位置类型(Geo datatypes) 3 ...
- Elasticsearch:运用 Java 对索引文档进行搜索
这是这个系列文章中的其中一篇文章: Elasticsearch:运用 Java 创建索引并写入数据 Elasticsearch:运用 Java 更新 Elasticsearch 文档 Elastics ...
- ElasticSearch修改和删除文档
ElasticSearch修改和删除文档 修改文档方式一:使用prepareUpdate,prepareIndex两者选其一皆可 client.prepareUpdate("blog2&qu ...
- 详细描述一下 Elasticsearch 更新和删除文档的过程。
1.删除和更新也都是写操作,但是 Elasticsearch 中的文档是不可变的,因此不能被删除或者改动以展示其变更. 2.磁盘上的每个段都有一个相应的.del 文件.当删除请求发送后,文档并没有真的 ...
- SpringCloud学习笔记024---SpringBoot集成Lucene实现全文检索_分词_索引_更新_删除文档_词条搜索_多条件查询
JAVA技术交流QQ群:170933152 先看代码实现,下面有lucene介绍: 测试用例 Github 代码 代码我已放到 Github ,导入spring-boot-lucene-demo 项目 ...
- 浅谈Word.Application,关于js操作word文档的使用
这篇文章只是说个人放个笔记在这里,并没有讲解的意思,但为了进来的朋友能知道我在说啥,写的过程中我还是简单介绍一下. 官网地址:https://docs.microsoft.com/zh-cn/offi ...
- 使用poi操作word文档实现套打功能
使用poi操作word文档实现套打功能 本文目的是为了分享一个实现套打功能,但是不同于简单的word的文本替换而是采用poi对word的文本框就行操作实现的功能: poi中各种jar的说明 套打的实现 ...
- Qt操作Word文档
Qt提供QAxObject操作Word文档,实现写入文档 准备工作 1.Qt pro文件中加入QT += axcontainer 2.电脑上至少有Word或者WPS 操作Word /********* ...
最新文章
- SCCM 2007系列7 补丁分发上
- 初学者成为优秀Java程序员的8个步骤
- day21 java的随机数
- JavaScript的Date类的函数特殊处理导致的问题
- 高等数学——二重积分的计算方法
- android手机微信收藏功能实现,微信小程序收藏功能的实现代码
- 【网络安全】前端程序员务必掌握的图片防盗链
- mysql触发器——NEW与OLD解析
- EasyAR_实现AR涂涂乐
- python去除图片马赛克_python 检测图片是否有马赛克
- 开源数库最佳实践-「3306π」社区北京站
- 近地天体撞击地球原理的设想
- 项目初期如何确定项目的进度计划和资源需求?
- getcwd()和chdir()的用法 python
- php nts,wamp 环境中的nts php 配置方式
- java民生银行支付接口_民生付商户端开发手册和接口规范V1.0.0.doc
- 【7】APPinventor用户界面组件用法及说明介绍(上)
- 语音去混响之MCLP算法
- 学生学籍信息管理系统(Java + SQL)
- 中兴路由器中RIP路由的配置