0


第五章 索引和文档的基本操作

文章目录

1、基于 REST 风格的 API

2、Kibana 的基本使用

2.1 优缺点

优点

  • 官方支持,兼容性好
  • 图形化界面,众多操作均可基于图形化操作完成,而无序任何代码
  • 功能强大,不仅有有丰富的可视化报表,还提供了非常强大的开发者工具
  • 快捷键丰富
  • 开发者工具
  • 样例数据

缺点

  • 对于 Dev 环境,每次使用都需要启动
  • 重负载,占用系统资源较大
  • 基于 Java 环境,启动慢

2.2 Dev Tools

  • 图形化界面
  • 高可配置性
  • Auto Format
  • 代码智能提示

3、Search API

基本语法

GET/<index_name>/_search 
GET/_search 

4、Index API

4.1 Setting(见:第四章 3.2 小节)

4.2 创建索引

4.2.1 基本语法

PUT<index_name>
  • index_name:索引名称

4.2.2 索引命名规范

  • 必须全部小写
  • 索引名称中不能包含以下符号:\/*?"<>|、空白符号、,#
  • 7.0 之前的索引可以包含冒号英文冒号 : ,但在 7.x 及之后版本中不再受支持。
  • 不使用中文命名索引
  • 可以使用-_或者+三种符号,但是不能以这三种符号开头。
  • 不能是.或者..
  • 不能超过 255 个字节长度
  • 业务索引不能以.开头,因为这些索引是给内部索引(如数据流中的后备索引)隐藏索引使用的

总结:如过记不住这些规则,请牢记以下几点

  • 以小写英文字母命名索引
  • 不要使用驼峰或者帕斯卡命名法则
  • 如过出现多个单词的索引名称,以全小写 + 下划线分隔的方式:如test_index

4.2.3 创建

4.3 删除索引

4.3.1 基本语法

DELETE/<index_name>
  • index_name:索引名称

4.4 判断索引是否存在

HEAD<index_name>

4.5 索引的不可变性

ES 索引创建成功之后,以下属性将不可修改

  • 索引名称
  • 主分片数量
  • 字段类型

4.6 Reindex

5、Document API

5.1 文档的操作类型

enum OpType {INDEX(0),CREATE(1)}
  • index:索引(动词),可以是创建,也可以是全量替换
  • create:不存在则创建,存在则报错

注意:

  • 以上操作均为写操作。
  • ES中的数据写入均发生在 Primary Shard
  • 当操作对象为数据流时,op_type 必须为 create

5.1.1 Create:创建

如果在 PUT 数据的时候当前数据已经存在,则数据会被覆盖,如果在 PUT 的时候指定操作类型 create,此时如果数据已存在则会返回失败,因为已经强制指定了操作类型为 create,ES就不会再去执行 update 操作。

比如:下面一行代码创建 id 为 1 的文档,指的就是在索引 goods 中强制创建 id 为 1 的文档,如果 id 为 1 的文档已存在,则返回失败。指定创建文档 id

基本语法

PUT/<index_name>/_doc/<_id>?op_type=create

上述代码,可简化为:

# 旧版本语法:PUT/<index_name>/_doc/<_id>/_create
PUT/<index_name>/_create/<_id>/

案例

创建一条 _id 为 1 的文档,并为其添加 name 和 content 两个字段

PUT goods/_doc/1?op_type=create
{"name":"傻妞手机","content":"华人牌2060款手机傻妞"}

或 执行

PUT goods/_create/1{"name":"傻妞手机","content":"华人牌2060款手机傻妞"}

当文档不存在的时候,返回 created

{"_index":"goods","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

当文档已存在的时候

{"error":{"root_cause":[{"type":"version_conflict_engine_exception","reason":"[1]: version conflict, document already exists (current version [1])","index_uuid":"p_2BvtuOTDeqikl4JXPmgQ","shard":"0","index":"goods"}],"type":"version_conflict_engine_exception","reason":"[1]: version conflict, document already exists (current version [1])","index_uuid":"p_2BvtuOTDeqikl4JXPmgQ","shard":"0","index":"goods"},"status":409}

5.1.2 Index:索引(创建或全量更新文档)

在 ES 中,写入操作被称为 Index,这里Index为动词,即索引数据为将数据创建在 ES 中的索引,写入数据亦可称之为“索引数据”。可以是创建,也可以是全量替换

基本语法

PUT/<index_name>/_doc/<_id>?op_type=index
{...}

上述代码,可简化为:

PUT/<index_name>/_doc/<_id>{...}

案例

向 goods 索引中索引一条 _id 为 1 的文档,并为其添加 name 和 content 两个字段

PUT goods/_doc/1?op_type=index
{"name":"傻妞手机","content":"华人牌2060款手机傻妞"}

或 执行

PUT goods/_doc/1{"name":"傻妞手机","content":"华人牌2060款手机傻妞"}

当文档不存在的时候,返回 created

{"_index":"goods","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

当文档存在的时候,返回 updated

{"_index":"goods","_id":"1","_version":3,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":2,"_primary_term":1}

5.1.2 自动生成 id

POST/<target>/_doc/

示例:创建一个文档,并随机生成文档 id

POST test_index/_doc
{"test_field":"test","test_title":"title"}

5.2 文档的 CRUD

5.2.1 Document Index API:索引 API

将 JSON 文档添加到指定的数据流或索引并使其可被检索。如果目标是索引并且文档已经存在,则请求更新文档并增加其版本号。

基本语法

PUT/<target>/_doc/<_id>PUT/<target>/_create/<_id>POST/<target>/_create/<_id>

创建一条文档

语法

PUT/<target>/_doc/<_id>{...}

案例

索引一条 _id 为 1 的文档,并为其添加 test_field 和 test_title 两个字段

PUT goods/_doc/1?op_type=index
{"name":"傻妞手机","content":"华人牌2060款手机傻妞"}

如过返回 created,代表索引创建成功

如过返回 updated,代表索引被全量替换

5.2.2 Get API

1:查询指定 id 的文档

GET<index>/_doc/<_id>

2:判断指定 id 的文档是否存在

HEAD<index>/_doc/<_id>

如过存在,返回 200

200-OK

如过不存在,返回 404

{"statusCode":404,"error":"Not Found","message":"404 - Not Found"}

通过 HEAD 判断文档是否存在的使用场景很局限,因为其完全可以被 GET 所取代,比如下列查询,当 id 为 1 的文档不存在的时候,返回

found:false
GET goods/_doc/1

执行结果如下

{"_index":"goods","_id":"1","found":false}

3:_source API

使用 _source API 可以打开或者关闭源数据字段,true 为打开,false 为关闭,默认为 true。

GET<index>/_doc/<_id>?_source=false

例如:当添加了

_source=false

之后,在结果中仅返回了元数据字段

{ "_index": "goods", "_id": "0", "_version": 1, "_seq_no": 0, "_primary_term": 1, "found": true }
{ "_index": "goods", "_id": "0", "_version": 1, "_seq_no": 0, "_primary_term": 1, "found": true, "_source": { "name": "傻妞手机", "content": "华人牌2060款手机傻妞" } }

当然也可以只查看 _source 字段,而不查看任何 mata data。

GET<index>/_source/<_id>?

例如:
GET goods/_source/0GET goods/_doc/0

{ "name": "傻妞手机", "content": "华人牌2060款手机傻妞" }
{ "_index": "goods", "_id": "0", "_version": 1, "_seq_no": 0, "_primary_term": 1, "found": true, "_source": { "name": "傻妞手机", "content": "华人牌2060款手机傻妞" } }

5.2.3 Delete API

删除索引中指定 id 的文档,Document Delete API 必须指定 id

DELETE/<index>/_doc/<_id>

比如删除 id 为 1 的文档

DELETE goods/_doc/1

5.2.4 Update API

修改局部字段或者数据

POST/<index>/_update/<_id>{"doc":{"<field_name>":"<field_value>"}}

注意:7.x 及之前版本的语法

POST test/_doc/1/_update

已不再支持

5.3 Multi get (mget) API

语法

GET/_mget
{"docs":[{"_index":"<index_name>","_id":"<_id>"},{"_index":"<index_name>","_id":"<_id>"}]}

支持查询同一个索引的不同 id,也可以查询不同索引的不同 id。

简化语法

GET<index_name>/_mget
{"docs":[{"_id":"<_id>"},{"_id":"<_id>"}]}

进一步简化

GET/<index_name>/_mget
{"ids":["<_id_1>","<_id_2>"]}

复杂语法的意义

负责的查询语法的意义在于其可编程性高,可以针对不同的文档,指定不同的查询策略,比如:

GET<>/_mget
{"docs":[{"_id":"1","_source":false},{"_id":"2","_source":true}]}

5.4 Bulk API

语法

POST/_bulk
POST/<index>/_bulk
{"action":{"mata data"}}{"data"}

5.4.1 Create Document

使用普通方式 create 一条文档

PUT goods/_create/1{"name":"傻妞手机","content":"华人牌2060款手机傻妞","price":12999,"type":"手机","level":"超级手机","createtime":"2060-10-01T08:00:00Z","tags":["时光穿梭","真人模式","手机模式"]}

如过使用 bulk API 写入,代码如下

POST/_bulk 
{"create":{"_index":"goods","_id":"1"}}{"name":"傻妞手机","content":"华人牌2060款手机傻妞","price":12999,"type":"手机","level":"超级手机","createtime":"2060-10-01T08:00:00Z","tags":["时光穿梭","真人模式","手机模式"]}

5.4.2 Index Document

使用普通方式索引一条文档

PUT goods/_doc/2{"name":"太子手机","content":"太子手机是傻妞手机的克隆机","price":8999,"type":"手机","level":"超级手机","createtime":"2060-10-01T08:00:00Z","tags":["时光穿梭","真人模式","手机模式"]}

如过使用 bulk API 写入,代码如下

POST/_bulk
{"index":{"_index":"goods","_id":"2"}}{"name":"太子手机","content":"太子手机是傻妞手机的克隆机","price":8999,"type":"手机","level":"超级手机","createtime":"2060-10-01T08:00:00Z","tags":["时光穿梭","手机模式"]}

5.4.3 Update Document

id 为 2 的文档商品价格由 8999 修改为 6999

POST goods/_update/2{"doc":{"price":6999}}

使用 bulk API 修改,代码如下

POST goods/_bulk
{"update":{"_index":"goods","_id":"2"}}{"doc":{"price":6999}}

5.4.4 Delete Ducoment

POST/_bulk
{"delete":{"_index":"goods","_id":"1"}}

使用场景

大数据量的批量操作,比如数据从 MySQL 中一次性写入 ES,批量写入减少了对 es 的请求次数,降低了内存开销以及对线程的占用。

注意

  • bulk api 对 json 的语法有严格的要求,除了 delete 外,每一个操作都要两个 json 串(mata data和 source field data),且每个 json 串内不能换行,非同一个 json 串必须换行,否则会报错;
  • bulk 操作中,任意一个操作失败,是不会影响其他的操作的,但是在返回结果里,会告诉你异常日志

优缺点

  • 优点:相较于普通的Json格式的数据操作,不会产生额外的内存消耗,性能更好,常用于大数据量的批量写入
  • 缺点:可读性差,可能会没有智能提示。

5.5 DeleteByQuery

POST/<index_name>/_delete_by_query
{"query":{...}}

5.6 UpdateByQuery ☆

update_by_query 通常和 Script 以及 Pipeline 结合使用,本章暂不多做介绍。

标签: 数据库 mysql spring

本文转载自: https://blog.csdn.net/wlei0618/article/details/127964821
版权归原作者 Elastic开源社区 所有, 如有侵权,请联系我们删除。

“第五章 索引和文档的基本操作”的评论:

还没有评论