Elasticsearch 文档的基本操作
前言
在了解了 Elasticsearch 的基本概念之后,下一步就是操作 ES 的文档了,毕竟数据还是以文档的方式存在 ES 里面。下面主要会介绍文档的 CRUD 操作、文档的元信息、批量写入和读取。
文档 CRUD
包括五个常用的操作 Index、Create、Read、Update、Delete,可以在下表中可以看到相关的命令,7.0中Type都约定用 _doc
操作 | 命令 |
---|---|
Index | PUT my_index/_doc/1 {“user”:“mike”, “comment”:“You know, for search”} |
Create | PUT my_index/_create/1 {“user”:“mike”, “comment”:“You know, for search”} POST my_index/_doc(如不指定ID,自动生成) {“user”:“mike”, “comment”:“You know, for search”} |
Read | GET my_index/_doc/1 |
Update | POST my_index/_update/1 {“doc”:{“user”:“mike”, “comment”:“You know, Elasticsearch”}} |
Delete | DELETE my_index/_doc/1 |
-
Create 文档:如果文档ID已经存在,会创建失败。支持自动生成文档ID和指定文档ID两种方式:使用 “POST /users/_doc”,系统会自动生成文档ID;使用 “PUT user/_create/1”,需要显示指定_create,如果该文档ID存在,就会操作失败。
//自动生成 ID POST users/_doc { "user" : "Mike", "post_date" : "2019-05-15 12:20:39", "message" : "trying out Kibana" } //指定ID,如果ID已存在,就会报错 POST users/_doc/1?op_type=create { "user" : "Mike", "post_date" : "2019-05-15 12:20:39", "message" : "trying out Kibana" }
-
Get 文档:见上表的 Read,读取一个文档。
GET users/_doc/1
下面是找到文档的截图,里面包含了文档的元信息和原始信息(_source里面)
-
Index 文档:如果文档ID不存在,创建新的文档,否则,先删除现有文档,再创建新的文档,版本号会增加。
PUT users/_doc/1 { "user" : "Jack" }
- Update 文档:文档必须已经存在,更新只会对相应字段做增量修改,而不会删除原来的文档。
POST users/_update/1 { "doc" : { "post_date" : "2021-05-09 12:27:34", "message" : "trying out Elaaticsearch" } }
- Delete 文档:删除文档
DELETE users
删除整个索引,DELETE users/_doc/1
删除ID为1的文档
批量操作(Bulk)
ES 支持在一次 API 调用中,对不同的索引进行操作,支持"Index、Create、Update、Delete"四种类型的操作。如果操作中单条操作失败,并不会影响其他操作,返回的结果包括了每一条操作执行的结果。索引的名称可以在 URI 中指定,也可以放在请求体中再指定,下面两种都是可以的
POST _bulk
{
{"index": {"_index": "test", "_id":"1"}}
{"field1":"value1"}
}
POST /products/_bulk
{ "index": { "_id": 1 }}
{ "price" : 10,"avaliable":true,"date":"2018-01-01", "productID" : "XHDK-A-1293-#fJ3" }
{ "index": { "_id": 2 }}
{ "price" : 20,"avaliable":true,"date":"2019-01-01", "productID" : "KDKE-B-9947-#kL5" }
{ "index": { "_id": 3 }}
{ "price" : 30,"avaliable":true, "productID" : "JODL-X-1937-#pV7" }
{ "index": { "_id": 4 }}
{ "price" : 30,"avaliable":false, "productID" : "QQPX-R-3956-#aD8" }
批量读取和查询(mget&msearch)
批量操作可以减少网络连接所产生的开销、提高性能,当然如果批量操作时数据量太大,会造成网络阻塞,反而降低性能。所以,凡事都得有个度,看数据量大小去分批。
- mget :
GET _mget { "docs":[ { "index":"user", "_id":1 }, { "index":"comment", "_id":1 }, ] }
- msearch:
POST users/_msearch {} {"query":{"match_all":{}}} {} {"index":"twitter1"}
总结
在文档基本 CRUD 操作上,ES 提供了批量操作的 API,可以减少建立网络连接的开销。单次批量操作数据量不宜过大,以免引发性能问题。