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.rhkb.cn/news/286881.html

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

相关文章

flutter 弹窗之系列三

Overlay 部分源码 class Overlay extends StatefulWidget{...static OverlayState of(BuildContext context, {bool rootOverlay false,Widget debugRequiredFor,})... } // rootOverlay: // 值为false, 就近查找,找到树中最近的节点; // 如果为true, 则去找最顶…

数据库专题(oracle基础和进阶)

前言 本专题主要记录自己最近学的数据库,有兴趣一起补习的可以一起看看,有补充和不足之处请多多指出。希望专题可以给自己还有读者带去一点点提高。 数据库基本概念 本模块有参考:数据库基本概念-CSDN博客 数据库管理系统是一个由互相关联的…

[Java基础揉碎]抽象类

目录 通过问题引出 介绍 关键点 细节 ​编辑 抽象类的最佳设计模式--模版设计模式 1.先用最容易想到的方法 2.分析问题,提出使用模板设计模式 通过问题引出 假如我们有个动物类, 动物都有eat吃的方法, 但是具体吃什么, 我们不知道, 因为是什么动物我们不知道…

Git版本控制

这是两个学习Git推荐必看的文档,第一个链接是Git的官方权威文档,第二个链接是国内程序员在开发中,总结的Git快速入门教程,掌握这个,也足够应付在工作中的场景。 Git权威书籍《ProGit》中文版https://gitee.com/progit…

jdk11中自定义java类在jvm是如何被查找、加载

yym带你了解jvm源码,openjdk11源码,java类jvm加载原理 jdk11中java类在jvm是如何被1查找、2加载 以下说明的是MiDept类是如何被java classloader 和 jvm加载步骤 上源代码 public static void main(String[] args) {Thread.currentThread().setName…

Python机器学习赋能GIS:地质灾害风险评价的新方法论

地质灾害是指全球地壳自然地质演化过程中,由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下,地质灾害在世界范围内频繁发生。我国除滑坡灾害外,还包括崩塌、泥石流、地面沉…

k8s记录-基础配置1

1、基础yaml文件格式 1.1、namespace apiVersion: v1 kind: Namespace metadata:name: namelabels:name: namekubectl apply -f namespace.yaml 1.2、Service service示例 apiVersion: v1 kind: Service metadata:name: ilanni-httpd-svcnamespace: ilanni-namespace spec:…

【代驾+顺风车+货运】全开源双端APP代驾+顺风车+货运代驾小程序源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 一、详细介绍 系统是基于Thinkphpuniapp开发的,全开源未加密,这套源码可以拿回去自己做二开 后台用户端司机端 功能详情介绍: 车主实名认证,驾驶证认证,车…

大学生实习被企业坑了,教训比较深刻

帮实习生解决一些疑惑,所以出了一个视频,大家多多支持 实习途径 1 靠自己(招聘平台投简历,大专及普通大学的选择) 2 靠关系(亲人、老师、朋友帮推荐,有关系就是好) 3 靠校招&#xf…

ROS机器人入门第四课:话题通信

文章目录 ROS机器人入门第四课:话题通信一、话题通信概述(一)概念(二)作用 二、话题通信基本操作需求:分析:流程:(一)发布方解释一些关键的ROS函数和概念: (二&#xff0…

力扣刷题44-46(力扣0062/0152/0198)

62. 不同路径 题目描述: 一个机器人位于一个 m x n 网格的左上角 ,机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路径? 思路: 其实就是问(0,0)->(m-1,n-1)一共有几条路。 第一个…

office办公技能|word中的常见使用问题解决方案2.0

一、设置多级列表将表注从0开始,设置为从1开始 问题描述:word中插入题注,出来的是表0-1,不是1-1,怎么办? 写论文时,虽然我设置了“第一章”为一级标题,但是这三个字并不是自动插入的…

QMT量化交易上手

文章目录 QMT介绍基本使用代码初始化股票和行情交易量化策略示例相关链接QMT介绍 QMT是迅投公司出品量化交易客户端软件,目前只能运行在windows机器上,分为QMT 和 miniQMT两种模式,后者可以采用python API做程序化交易,极大方便了广大散户。这点上比同花顺/通信达好很多。…

软件推荐 篇三十七:安卓软件推荐IP Tools「IP工具」:全面解析网络状态与管理的必备神器

引言: 随着互联网的普及,网络已经成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐,我们都需要通过网络来进行各种操作。然而,网络问题的出现往往会给我们带来诸多困扰。为了更好地管理和优化网络,我们…

tomcat配置静态资源后无法正常访问

目录 一、场景二、配置三、访问异常四、排查五、原因六、解决 一、场景 1、将前端文件存在到指定目录 2、在tomcat配置静态资源 3、配置后无法正常访问到前端文件 二、配置 1、tomcat配置 2、静态资源 三、访问异常 四、排查 可以ping通,但是访问不了3080端口 …

rabbitmq 3.9.29 docker mac 管理员页面无法打开

SyntaxError: Unexpected token ‘catch’ SyntaxError: Unexpected token ‘catch’ at EJS.Compiler.compile (http://127.0.0.1:15672/js/ejs-1.0.min.js:1:6659) at new EJS (http://127.0.0.1:15672/js/ejs-1.0.min.js:1:1625) at format (http://127.0.0.1:15672/js/main…

程序员35岁会失业吗?【来自主流AI的回答】

程序员35岁会失业吗? 35岁被认为是程序员职业生涯的分水岭,许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长,技术更新换代的速度会使得资深程序员难以跟上;而另一些人则认为,丰富的经…

用BSP优化3D渲染

3D渲染引擎设计者面临的最大问题之一是可见性计算:只必须绘制可见的墙壁和物体,并且必须以正确的顺序绘制它们(应该在远处的墙壁前面绘制近墙) 。 更重要的是,对于游戏等应用程序来说,开发能够快速渲染场景…

【python】Jupyter Notebook 修改默认路径

文章目录 一、修改前(一)问题(二)修改前的默认路径 二、修改配置文件、更改路径(一)找到配置文件并打开(二)创建目标文件夹、得到新的路径(三)修改配置文件 三…