ElasticSearch8 - 基本操作

前言

本文记录 ES 的一些基本操作,就是对官方文档的一些整理,按自己的习惯重新排版,凑合着看。官方的更详细,建议看官方的。

下文以 books 为索引名举例。

新增

添加单个文档 (没有索引会自动创建)

POST books/_doc
{"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "age": 18}

不指定 id,会随机生成,如果需要指定 id,使用 POST books/_doc/id

还可以使用 put 的方式新增,例入 POST books/_doc/id,这种方式必须带 id,否则会报错

以上两种方式,如果带上了 id,就是不存在就插入,存在旧更新

更新

总结 (有三种方式):

  • POST 更新
    • 如果 URL 带 _update,更新前会对比新旧数据,如果新旧数据完全相同,将不会进行任何操作 noop,不会影响序列号、版本号信息。
    • 如果 URI 不带 _update,不会检查原数据,都会显示 updated
  • PUT 更新
    • 路径没法带 _update,每次都会更新显示 updated

例如有原数据

{"name": "zhangsan","age": 18
}

POST 访问:(路径带_update)

需要在参数外套一层 doc,这种方式不影响其他字段

POST /books/_update/1
{"doc": {"name": "lisi"}
}// 执行之后原数据变成
{"name": "lisi","age": 18
}

POST 访问:(路径不带_update)

和带 id 新增的语法是一样的,不存在就是插入,存在就是更新。这种方式会清空其他字段

POST /books/_doc/1
{"name": "lisi"
}// 执行之后原数据变成
{"name": "lisi"
}

PUT 访问:(路径不能带_update)

效果同第 2 点

PUT /books/_doc/1
{"name": "lisi"
}

删除

DELETE /books/_doc/1POST /books/_delete_by_query
{查询条件...}

搜索

官方实例数据:account. json

使用 [Bulk API](Bulk API | Elasticsearch Guide [8.12] | Elastic) 来批量插入,没有安装 kibana 也可以用 postman 导入

如果插入记录搜索不到,可能是索引未来得及刷新,可以手动触发

POST /article/_refresh

根据 id 获取文档

// 获取带元数据的
GET /bank/_doc/1
// 获取不带元数据的
GET /bank/_source/1
// 判断文档是否存在
HEAD /bank/_doc/1

使用 HEAD 只会返回 {} 空对象,可以根据请求是否 404 判断文档是否存在

_search 命令搜索

注意:如果你用 es-client 连接的 es,请将 GET 换成 POST,否则查询无效

原因是 GET 请求没有带上 body 参数

默认只会返回最先匹配到的 10 条文档

GET /bank/_search

返回结果:

took:检索花费时间,单位毫秒(从节点收到查询到将数据返回客户端之前)

timed_out: 布尔类型,检索是否超时

hits: 命中的记录

total.value: 总记录的数量

hits.total: 所有命中的记录

搜索全部

GET /bank/_search
{"query": {"match_all": {}}
}

排序

Sort search results | Elasticsearch Guide [8.12] | Elastic

GET /bank/_search
{"sort": [{"account_number": "desc"},{"balance": { // 两种写法都行"order": "asc"}}]
}

sort :排序条件,先对 account_number 降序,如果 account_number 相同,再对 balance 升序

其他排序参数

GET /bank/_search
{"sort": [{"arr": {"order": "desc", // 排序"mode": "min", // 排序模式"missing": "_last" // 缺失值处理}}]
}

排序模式

用于对数组或多值字段排序。比如有数据如下

{"age": 25,"arr": [11000,23234]
}

arr 字段就是多值字段。

升序排序的默认排序模式是 min 。默认的降序排序模式是 max

mode说明
min选择最低值
max选择最高值
sum总和作为排序值
avg平均值作为排序值
median中位数作为排序值

缺失值处理

顾名思义,就是排序时,没有该字段的文档排前面还是排后面。

missing 值可以设置为 _last 、 _first,默认为 _last

分页

Paginate search results | Elasticsearch Guide [8.12] | Elastic

查询方式数据量实时查询排序跳页适用场景
form+size 浅分页支持支持支持实时查询,跳页查询
scroll 标准方式不支持支持不支持深度分页,有序的批量查询
scroll_scan 滚动扫描不支持不支持不支持深度分页,无需的批量查询
search_after 分页支持支持不支持深度分页,数据批量导出

from + size

默认返回前 10 个结果。可以使用 from 和 size 参数,from 定义要跳过的命中数,默认 0,size 是返回的最大命中数。类比 mysql 中的 limit 0,10

默认情况下,无法使用 from 和 size 来翻阅超过 10,000 个匹配项。也就是前 10000 条数据可以用这种方式分页。如果数据太多,请使用search_after

GET /bank/_search
{"from": 0,"size": 10
}

search_after

注意:搜索必须指定排序字段,否则获取不到 search_after 需要的参数。

使用步骤:
一、第一页不需要使用 search_after

// 查询
GET /bank/_search
{"sort": [ // 必须指定排序字段"account_number","age"]
}// 响应
{..."hits": {..."hits": [{..."sort": [ 0, 29]}]}
}

第二页的搜索,就带上前一页的 hits.sort 中的参数

GET /bank/_search
{"search_after": [0, 29],"sort": [ // 必须指定排序字段"account_number","age"]
}

TODO PIT

A 查询数据,B 同时在插入数据,为了解决 A 两次查询的数据不一致,可以使用 point int time

检索选定的字段

Retrieve selected fields from a search | Elasticsearch Guide [8.12] | Elastic

关键词 fields,可以指定返回字段和格式

搜索 API

Query DSL | Elasticsearch Guide [8.12] | Elastic

Search API | Elasticsearch Guide [8.12] | Elastic

query 和 filter

query 就是普通的查询,会计算分数。

filter 不会计算分数,es 还会自动缓存常用的过滤器提高性能

说明:Query and filter context | Elasticsearch Guide [8.12] | Elastic

用法:Boolean query | Elasticsearch Guide [8.12] | Elastic

复合查询

Compound queries | Elasticsearch Guide [8.12] | Elastic

全文查询

intervals 文本灵活查询

Intervals query | Elasticsearch Guide [8.12] | Elastic

允许用户精确控制查询词在文档中出现的先后关系,实现了对 terms 顺序、terms 之间的距离以及它们之间的包含关系的灵活控制

match 模糊查询

Match query | Elasticsearch Guide [8.12] | Elastic

对基本类型,是精确匹配(比如 long、日期等)。对字符串是模糊查询,对查询的值分词,对分词的结果一一进入倒排索引去匹配

GET /ft/_search
{"query": {"match" : {"my_text":{"query": "my when","operator": "or"}}}
}

解释:查找 my_text 字段中包含 my 或者 when 的文档。

query: 需要查询的内容

operator:默认是 or,如果改成 and,就需要 my_text 中同时包含 when 和 my

analyzer:分词器,默认使用字段的分词器

prefix 前缀查询

GET /ft/_search
{"query": {"prefix": {"my_text": {"value": "favo"}}}
}

匹配 my_text 中以 favo 开头的,注意是不能分词的,也就是 my fa 查不到 cold my favourite food,但是用 favo 可以找到

match_bool_prefix 分词前缀查询

prefix 不能分词,那么 match_bool_prefix 就来了

GET /ft/_search
{"query": {"match_bool_prefix": {"my_text": {"query": "quick brown f"}}}
}

解释:先分词,最后一个词按前缀处理,前面的词语直接匹配,只要有一个命中就可以

匹配 quick brown foxtwo quick brown ferretsthe fox is quick and brown

match_phrase 短语匹配查询

顾名思义,match 会分词,match_phrase 不会分词

GET /ft/_search
{"query": {"match_phrase": {"my_text": {"query": "wo shi"}}}
}

match_phrase_prefix 短语前缀匹配查询

GET /ft/_search
{"query": {"match_phrase_prefix": {"my_text": {"query": "quick brown f"}}}
}

与 match_bool_prefix 的区别就是不分词,匹配 quick brown foxtwo quick brown ferrets,不匹配 the fox is quick and brown

combined_fields 组合多字段查询

Combined fields | Elasticsearch Guide [8.12] | Elastic

这个有点不太理解。

GET /ft/_search
{"query": {"combined_fields": {"query": "ren shui","fields": ["title","my_text"],"operator": "and"}}
}

解释:效果类似于将 title 和 my_text 两个字段合并成一个,再执行查询

注意,我把 operator 改成 and 了,但是只要 title 和 my_text 组合起来,包含了 ren 和 shui 就能命中

multi_match 多字段查询

Multi-match query | Elasticsearch Guide [8.12] | Elastic

在 match 查询的基础上,允许多字段查询

GET /ft/_search
{"query": {"multi_match": {"query": "ren shui","fields": ["title","my_text"],"operator": "and"}}
}

解释:我把 operator 改成了 and,那么需要 title 同时包含 ren 和 shui 两个词,或者 my_text 同时包含两个词,才能命中。和 combined_fields 有区别的。

总结

没啥好总结的,吐槽一句,官方文档对新手不太友好。新手需要的是快速使用,怎么调 api

参考

【ElasticSearch(四)】PUT&POST更新数据、DELETE删除数据、_bulk批量操作 - musecho - 博客园 (cnblogs.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器总是宕机问题记录

博主介绍: 22届计科专业毕业,来自湖南,主要是在CSDN记录一些自己在Java开发过程中遇到的一些问题,欢迎大家一起讨论学习,也欢迎大家的批评指正。 文章目录 背景调整总结 背景 2核2G的服务器,服务器安装了t…

计算机网络:物理层中的数字传输系统全景概览解析

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

Django之Celery篇(三)

一、任务交给Celery Django任务交给Celery的方法和普通使用Celery任务的调用基本无区别,只是将执行代码的放到到View视图中 而获取结果,往往并不能把结果和第1次请求一起响应,若想获取结果是通过第2次请求获取结果 代码如下: from django.http import HttpResponsefrom …

华为ensp中vrrp虚拟路由器冗余协议 原理及配置命令

CSDN 成就一亿技术人! 作者主页:点击! ENSP专栏:点击! CSDN 成就一亿技术人! ————前言————— VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议&#xff0…

[数据集][目标检测]高质量铁路轨道缺陷检测数据集VOC+YOLO格式1050张6类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1050 标注数量(xml文件个数):1050 标注数量(txt文件个数):1050 标注…

【机器学习】基于变色龙算法优化的BP神经网络分类预测(SSA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】变色龙优化算法(CSA)原理及实现 2.设计与实现 数据集: 数据集样本总数2000 多输入多输出:样本特征24&#xff…

集成学习 | 集成学习思想:Boosting思想 | XGBoost算法、LightGBM算法

目录 一. XGBoost 算法1. XGBoost 算法流程2. XGBoost 算法评价 二. LightGBM 算法2. LightGBM 算法优势 上一篇文章中,我们了解了Boosting思想的两种算法:Adboost和GBDT;其中对于GBDT算法,存在两种改进,即&#xff1a…

javaWeb奶茶商城前后台系统

一、简介 在当前数字化时代,电子商务已成为人们生活中不可或缺的一部分。为了满足用户对奶茶的需求,我设计并实现了一个基于JavaWeb的奶茶商城前后台系统。该系统涵盖了用户前台和管理员后台两大模块,包括登录注册、商品展示、购物车管理、订…

【ARXIV2402】MambaIR

这个工作首次将 Mamba 引入到图像修复任务,关于为什么 Mamba 可以用于图像修复,作者有非常详细的解释:一路向北:性能超越SwinIR!MambaIR: 基于Mamba的图像复原基准模型 作者认为Mamba可以理解为RNN和CNN的结合&#xf…

【测试开发学习历程】计算机编程语言

前言: 学习完数据库,我们便要进入到编程语言的内容当中了。 这里先对编程语言写出大致的分类, 在这之后,我们会以Python为重点, 开始测试开发为重点的编程语言学习。 目录 1 计算机编程语言的发展 2 语言的分类…

JAVA 学习记录(1)

1.函数 (1)String.join(";", messages); ";" 表示分隔符,输出的结果: message; (2) Double.parseDouble(valueString); 它返回由字符串参数表示的双精度值。 (3) Double.valueOf((Float) value; float 类型的数值转化为double类…

计数组合【2024蓝桥杯0基础】-学习笔记

文章目录 计数原理排列数组合数组合数性质例题分析代码复现 例题2状态分析代码复现 常见的排列组合问题圆排列代码复现 第二类斯特林数 感悟 计数原理 排列数 组合数 组合数性质 例题分析 代码复现 def ksm(a, b, c):ans 1%cwhile b ! 0:if b % 2 0:ans ans * a %ca a * …

java面向对象编程基础

对象: java程序中的对象: 本质上是一种特殊的数据结构 对象是由类new出来的,有了类就可以创建对象 对象在计算机的执行原理: student s1new student();每次new student(),就是在堆内存中开辟一块内存区域代表一个学生对象s1变…

K3 计划订单投放时,将“关联物料”传递到采购和生产订单的“组部件”字段

参考K/3 WISE 中MRP计算投放过程中 销售订单自定义字段怎么携带到任务单这篇文章,进行优化。 在表ICMrpDestBills下增加触发器,代码如下 CREATE TRIGGER [dbo].[ICMrpDestBills_update]ON [dbo].[ICMrpDestBills]AFTER INSERT,UPDATE AS BEGINSET NO…

查询正在运行的Top SQL的脚本(建议收藏)

这篇文章提供了一些现成的SQL脚本,通过查询V$SQLSTATS视图找到正在运行的TOP SQL,用于后续的优化。建议大家收藏,需要查询TOP SQL时直接复制和粘贴即可。 之前的一篇文章解释了为什么要使用V$SQLSTATS视图。 当数据库表现出各种不同的性能问…

javaSwing推箱子游戏

一、简介 策略性游戏可以锻炼人的思维能力还能缓解人的压力,使人们暂时忘却生活当中的烦恼,增强人们的逻辑思维能力,游戏的艺术美也吸引着越来越多的玩家和厂商,寓教于乐,在放松人们心情的同时还可以活跃双手。在人类…

Docker数据卷与网络模式

华子目录 数据卷注意数据卷操作查看镜像,容器,数据卷所占空间 Docker的网络模式查看指定容器的网络模式bridge模式none模式host模式container模式 数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有…

Open CASCADE学习|显示文本

目录 1、修改代码 Viewer.h: Viewer.cpp: 2、显示文本 OpenCasCade 你好啊 霜吹花落 1、修改代码 在文章《Open CASCADE学习|显示模型》基础上,增加部分代码,实现对文本显示的支持,具体如下: Viewer…

从数据页的角度看 B+ 树

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 大家背八股文的时候,都知道 MySQL 里 InnoDB 存储引擎是采用 B 树来组织数据的。 这点没错,但是大家知道 B 树里的节点里存放的是什么呢?查询数据的过程又是怎样的&am…

填补市场空白,Apache TsFile 如何重新定义时序数据管理

欢迎全球开发者参与到 Apache TsFile 项目中。 刚刚过去的 2023 年,国产开源技术再次获得国际认可。 2023 年 11 月 15 日,经全球最大的开源软件基金会 ASF 董事会投票决议,时序数据文件格式 TsFile 正式通过,直接晋升为 Apache T…