文章目录
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 结合使用,本章暂不多做介绍。
版权归原作者 Elastic开源社区 所有, 如有侵权,请联系我们删除。