news 2026/4/18 12:41:33

elasticSearch之API:基础命令及文档基本操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
elasticSearch之API:基础命令及文档基本操作

文章目录

  • 一、基本检索
    • 1、cat API
    • 2、索引文档初探
  • 二、文档操作
    • 1、示例数据
    • 2、添加(索引)文档
    • 3、修改文档
      • (1)PUT 全量更新
      • (2)使用_update部分更新
      • (3)使用 _update_by_query 更新文档
      • (4)并发场景下修改文档
    • 4、查询文档
      • (1)根据id查询
      • (2)条件查询 - 请求url方式
      • (3)条件查询 - 请求体方式(复杂查询)
    • 5、删除文档
    • 6、文档批量操作
      • (1)批量写入
      • (2)批量读取

一、基本检索

1、cat API

/_cat/allocation#查看单节点的shard分配整体情况/_cat/shards#查看各shard的详细情况/_cat/shards/{index}#查看指定分片的详细情况/_cat/master#查看master节点信息/_cat/nodes#查看所有节点信息/_cat/indices#查看集群中所有index的详细信息/_cat/indices/{index}#查看集群中指定index的详细信息/_cat/segments#查看各index的segment详细信息,包括segment名, 所属shard, 内存(磁盘)占用大小, 是否刷盘/_cat/segments/{index}#查看指定index的segment详细信息/_cat/count#查看当前集群的doc数量/_cat/count/{index}#查看指定索引的doc数量/_cat/recovery#查看集群内每个shard的recovery过程.调整replica。/_cat/recovery/{index}#查看指定索引shard的recovery过程/_cat/health#查看集群当前状态:红、黄、绿/_cat/pending_tasks#查看当前集群的pending task/_cat/aliases#查看集群中所有alias信息,路由配置等/_cat/aliases/{alias}#查看指定索引的alias信息/_cat/thread_pool#查看集群各节点内部不同类型的threadpool的统计信息,/_cat/plugins#查看集群各个节点上的plugin信息/_cat/fielddata#查看当前集群各个节点的fielddata内存使用情况/_cat/fielddata/{fields}#查看指定field的内存使用情况,里面传field属性对应的值/_cat/nodeattrs#查看单节点的自定义属性/_cat/repositories#输出集群中注册快照存储库/_cat/templates#输出当前正在存在的模板信息

2、索引文档初探

在7.0之前,一个 Index可以设置多个Types
目前Type已经被Deprecated,7.0开始,一个索引只能创建一个Type - “_doc”

传统关系型数据库和Elasticsearch的区别:
Elasticsearch- Schemaless /相关性/高性能全文检索
RDMS —事务性/ Join

索引(Index)
一个索引就是一个拥有几分相似特征的文档的集合。比如说,可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。
一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。

文档(Document)
Elasticsearch是面向文档的,文档是所有可搜索数据的最小单位。
日志文件中的日志项
一本电影的具体信息/一张唱片的详细信息
MP3播放器里的一首歌/一篇PDF文档中的具体内容

文档会被序列化成JSON格式,保存在Elasticsearch中
JSON对象由字段组成
每个字段都有对应的字段类型(字符串/数值/布尔/日期/二进制/范围类型)

每个文档都有一个Unique ID
可以自己指定ID或者通过Elasticsearch自动生成

一篇文档包含了一系列字段,类似数据库表中的一条记录

JSON文档,格式灵活,不需要预先定义格式
字段的类型可以指定或者通过Elasticsearch自动推算
支持数组/支持嵌套

元数据,用于标注文档的相关信息:
_index:文档所属的索引名
_type:文档所属的类型名
_id:文档唯—ld
_source: 文档的原始Json数据
_version: 文档的版本号,修改删除操作_version都会自增1
_seq_no: 和_version一样,一旦数据发生更改,数据也一直是累计的。Shard级别严格递增,保证后写入的Doc的_seq_no大于先写入的Doc的_seq_no。
_primary_term: _primary_term主要是用来恢复数据时处理当多个文档的_seq_no一样时的冲突,避免Primary Shard上的写入被覆盖。每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1。

二、文档操作

1、示例数据

# 索引 我们这里用standard ,没装ikPUT /es_db{"settings":{"index":{"analysis.analyzer.default.type":"ik_max_word"}}}PUT /es_db/_doc/1{"name":"张三","sex":1,"age":25,"address":"广州天河公园","remark":"java developer"}PUT /es_db/_doc/2{"name":"李四","sex":1,"age":28,"address":"广州荔湾大厦","remark":"java assistant"}PUT /es_db/_doc/3{"name":"王五","sex":0,"age":26,"address":"广州白云山公园","remark":"php developer"}PUT /es_db/_doc/4{"name":"赵六","sex":0,"age":22,"address":"长沙橘子洲","remark":"python assistant"}PUT /es_db/_doc/5{"name":"张龙","sex":0,"age":19,"address":"长沙麓谷企业广场","remark":"java architect assistant"}PUT /es_db/_doc/6{"name":"赵虎","sex":1,"age":32,"address":"长沙麓谷兴工国际产业园","remark":"java architect"}

2、添加(索引)文档

注意:post没有幂等性,put有幂等性。

格式:[PUT | POST] /索引名称/[_doc | _create ]/id

# 创建文档,指定id# 如果id不存在,创建新的文档,否则先删除现有文档,再创建新的文档,版本会增加PUT /es_db/_doc/1{"name":"张三","sex":1,"age":25,"address":"广州天河公园","remark":"java developer"}#创建文档,ES生成idPOST /es_db/_doc{"name":"张三","sex":1,"age":25,"address":"广州天河公园","remark":"java developer"}


注意:POST和PUT都能起到创建/更新的作用,PUT需要对一个具体的资源进行操作也就是要确定id才能进行更新/创建,而POST是可以针对整个资源集合进行操作的,如果不写id就由ES生成一个唯一id进行创建新文档,如果填了id那就针对这个id的文档进行创建/更新

Create -如果ID已经存在,会失败

3、修改文档

(1)PUT 全量更新

PUT 全量更新,整个json都会替换,格式:[PUT | POST] /索引名称/_doc/id
如果文档存在,现有文档会被删除,新的文档会被索引

# 全量更新,替换整个jsonPUT /es_db/_doc/1{"name":"张三","sex":1,"age":25}#查询文档GET /es_db/_doc/1

(2)使用_update部分更新

使用_update部分更新,格式:POST /索引名称/_update/id
update不会删除原来的文档,而是实现真正的数据更新

# 部分更新:在原有文档上更新# Update -文档必须已经存在,更新只会对相应字段做增量修改POST /es_db/_update/1{"doc":{"age":28}}#查询文档GET /es_db/_doc/1

(3)使用 _update_by_query 更新文档

POST /es_db/_update_by_query{"query":{"match":{"_id":1}},"script":{"source":"ctx._source.age = 30"}}

(4)并发场景下修改文档

_seq_no和_primary_term是对_version的优化,7.X版本的ES默认使用这种方式控制版本,所以当在高并发环境下使用乐观锁机制修改文档时,要带上当前文档的_seq_no和_primary_term进行更新

POST /es_db/_doc/2?if_seq_no=21&if_primary_term=6{"name":"李四xxx"}

如果版本号不对,会抛出版本冲突异常,如下图:

4、查询文档

(1)根据id查询

根据id查询文档,格式:GET /索引名称/_doc/id

GET /es_db/_doc/1

(2)条件查询 - 请求url方式

条件查询 _search,格式:/索引名称/_doc/_search

# 查询前10条文档GET /es_db/_doc/_search

ES Search API提供了两种条件查询搜索方式:
REST风格的请求URI,直接将参数带过去
封装到request body中,这种方式可以定义更加易读的JSON格式

#通过URI搜索,使用“q”指定查询字符串,“query string syntax” KV键值对#条件查询, 如要查询age等于28岁的 _search?q=*:***GET /es_db/_doc/_search?q=age:28#范围查询, 如要查询age在25至26岁之间的 _search?q=***[** TO **] 注意: TO 必须为大写GET /es_db/_doc/_search?q=age[25TO26]#查询年龄小于等于28岁的 :<=GET /es_db/_doc/_search?q=age:<=28#查询年龄大于28前的 :>GET /es_db/_doc/_search?q=age:>28#分页查询 from=*&size=*GET /es_db/_doc/_search?q=age[25TO26]&from=0&size=1#对查询结果只输出某些字段 _source=字段,字段GET /es_db/_doc/_search?_source=name,age#对查询结果排序 sort=字段:desc/ascGET /es_db/_doc/_search?sort=age:desc

(3)条件查询 - 请求体方式(复杂查询)

通过请求体的搜索方式(此处就不详细介绍,各种复杂查询)

GET /es_db/_search{"query":{"match":{"address":"广州白云"}}}

5、删除文档

格式:DELETE /索引名称/_doc/id

DELETE /es_db/_doc/1

6、文档批量操作

批量操作可以减少网络连接所产生的开销,提升性能
支持在一次API调用中,对不同的索引进行操作
可以在URI中指定Index,也可以在请求的Payload中进行
操作中单条操作失败,并不会影响其他操作
返回结果包括了每一条操作执行的结果

(1)批量写入

批量对文档进行写操作是通过_bulk的API来实现的
请求方式:POST
请求地址:_bulk
请求参数:通过_bulk操作文档,一般至少有两行参数(或偶数行参数)
第一行参数为指定操作的类型及操作的对象(index,type和id)
第二行参数才是操作的数据
参数类似于:

{"actionName":{"_index":"indexName","_type":"typeName","_id":"id"}}{"field1":"value1","field2":"value2"}

actionName:表示操作类型,主要有create,index,delete和update

# 批量创建文档createPOST _bulk{"create":{"_index":"article","_type":"_doc","_id":3}}{"id":3,"title":"张三","content":"张三666","tags":["java","面向对象"],"create_time":1554015482530}{"create":{"_index":"article","_type":"_doc","_id":4}}{"id":4,"title":"李四","content":"李四NB","tags":["java","面向对象"],"create_time":1554015482530}# 普通创建或全量替换index# 如果原文档不存在,则是创建# 如果原文档存在,则是替换(全量修改原文档)POST _bulk{"index":{"_index":"article","_type":"_doc","_id":3}}{"id":3,"title":"王五","content":"王五老师666","tags":["java","面向对象"],"create_time":1554015482530}{"index":{"_index":"article","_type":"_doc","_id":4}}{"id":4,"title":"诸葛","content":"诸葛NB","tags":["java","面向对象"],"create_time":1554015482530}# 批量删除deletePOST _bulk{"delete":{"_index":"article","_type":"_doc","_id":3}}{"delete":{"_index":"article","_type":"_doc","_id":4}}# 批量修改updatePOST _bulk{"update":{"_index":"article","_type":"_doc","_id":3}}{"doc":{"title":"ES大法必修内功"}}{"update":{"_index":"article","_type":"_doc","_id":4}}{"doc":{"create_time":1554018421008}}# 组合应用POST _bulk{"create":{"_index":"article","_type":"_doc","_id":3}}{"id":3,"title":"cxf老师","content":"cxf老师666","tags":["java","面向对象"],"create_time":1554015482530}{"delete":{"_index":"article","_type":"_doc","_id":3}}{"update":{"_index":"article","_type":"_doc","_id":4}}{"doc":{"create_time":1554018421008}}

bulk API 以此按顺序执行所有的 action(动作)。如果一个单个的动作因任何原因而失败, 它将继续处理它后面剩余的动作。当 bulk API 返回时,它将提供每个动作的状态(与发送 的顺序相同),所以您可以检查是否一个指定的动作是不是失败了。

(2)批量读取

es的批量查询可以使用mget和msearch两种。其中mget是需要我们知道它的id,可以指定不同的index,也可以指定返回值source。msearch可以通过字段查询来进行一个批量的查找。

_mget:

#可以通过ID批量获取不同index和type的数据GET _mget{"docs":[{"_index":"es_db","_id":1},{"_index":"article","_id":4}]}#可以通过ID批量获取es_db的数据GET /es_db/_mget{"docs":[{"_id":1},{"_id":4}]}#简化后GET /es_db/_mget{"ids":["1","2"]}


_msearch:
在_msearch中,请求格式和bulk类似。查询一条数据需要两个对象,第一个设置index和type,第二个设置查询语句。查询语句和search相同。如果只是查询一个index,我们可以在url中带上index,这样,如果查该index可以直接用空对象表示。

GET /es_db/_msearch{}{"query":{"match_all":{}},"from":0,"size":2}{"index":"article"}{"query":{"match_all":{}}}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 13:04:15

【UMEP第12.3期】LQF实例教程:模拟伦敦2015年人类活动热通量QF

目录Initial Practical stepsLQF 教程 1&#xff1a;简单的人类活动热流&#xff08;QF&#xff09;建模准备数据&#xff08;Preparing data&#xff09;一、准备输入数据二、配置 shapefile&#xff08;人口与输出区域&#xff09;三、验证人口属性字段四、建模所需的 NML 配…

作者头像 李华
网站建设 2026/4/18 3:33:47

Flask-Caching深度详解

1. 他是什么Flask-Caching 是 Flask 框架的一个扩展包。你可以把它理解为给 Flask 应用配备的一个“快速存取仓库”。Flask 本身没有自带缓存功能。当应用收到请求时&#xff0c;即使请求的是完全相同的数据&#xff0c;每次都得把数据库翻一遍&#xff0c;或者把复杂的计算重来…

作者头像 李华
网站建设 2026/4/18 3:35:49

Java后端开发者必看:收藏这份120天转型大模型工程师的魔鬼训练路线图【后端开发转行大模型应用开发】

本文针对Java后端开发者&#xff0c;揭示了从传统后端到AI大模型工程师的转型路径。文章对比了传统后端与大模型工程师的薪资差距&#xff0c;强调了后端开发者转型大模型的优势&#xff0c;包括分布式系统理解、工程化能力、架构设计思维等。同时&#xff0c;提供了详细的120天…

作者头像 李华
网站建设 2026/4/18 8:15:19

RavenDB Enterprise 7.2.0

RavenDB Enterprise是一款高性能 NoSQL OLTP 文档数据库&#xff0c;以其简洁性、集群功能和强大的特性而著称。跨多个节点的实时复制确保了数据安全性和持续可用性。它支持高达每秒 15 万次的写入和超过 100 万次的读取&#xff0c;是 Windows、Linux、macOS 和 Docker 等平台…

作者头像 李华
网站建设 2026/4/18 10:53:50

如何防御你的 RAG 系统免受上下文投毒攻击

作者&#xff1a;来自 Elastic Toms Mura 上下文工程技术如何防止 LLM 响应中的上下文投毒。 Agent Builder 现在已经正式发布。你可以通过 Elastic Cloud Trial 开始使用&#xff0c;并在这里查看 Agent Builder 的文档。 随着 Claude Sonnet 4.5、Gemini 3 系列 和 GPT 5 等模…

作者头像 李华
网站建设 2026/4/18 8:50:58

AI系统安全加固方案:架构师如何设计安全的密钥管理系统

AI系统安全加固方案&#xff1a;架构师如何设计安全的密钥管理系统 一、引言&#xff1a;AI时代&#xff0c;密钥管理为什么是“生命线”&#xff1f; 2023年&#xff0c;某头部AI公司发生了一起API密钥泄露事件&#xff1a;一名工程师将包含LLM推理API密钥的配置文件误推到公共…

作者头像 李华