ElasticSearch(二):文档的基本CRUD与批量操做
学习课程连接《Elasticsearch核心技术与实战》网络
<br/> ## Create 文档 支持自动生成文档_id和指定文档_id两种方式。 * 经过调用`POST index_name/_doc`,系统会自动生成文档 _id。 ``` #create document. 自动生成 _id POST users/_doc { "user" : "Mike", "post_date" : "2019-04-15T14:12:12", "message" : "trying out Kibana" } ``` ``` #返回结果 { "_index" : "users", "_type" : "_doc", "_id" : "TyPHr20BkakgvNgYZu2L",#自动生成文档的_id "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1 } ``` * 使用`PUT index_name/_create/_id`或`PUT index_name/_doc/_id?op_type=create`建立时,URI中显示指定`_create`,此时若是该_id的文档已经存在,操做会失败。 ``` #1.create document. 指定 _id 若是已经存在,就报错 PUT users/_create/1 { "user" : "Jack", "post_date" : "2019-05-15T14:12:12", "message" : "trying out Elasticsearch" } #2.create document. 指定_id。若是_id已经存在,报错 PUT users/_doc/1?op_type=create { "user" : "Jack", "post_date" : "2019-05-15T14:12:12", "message" : "trying out Elasticsearch" } ``` ``` #若是_id已经存在报错信息,以下: { "error": { "root_cause": [ { "type": "version_conflict_engine_exception", "reason": "[1]: version conflict, document already exists (current version [1])", "index_uuid": "ohLNyzUmTv6cm-Ih9kH0bw", "shard": "0", "index": "users" } ], "type": "version_conflict_engine_exception", "reason": "[1]: version conflict, document already exists (current version [1])", "index_uuid": "ohLNyzUmTv6cm-Ih9kH0bw", "shard": "0", "index": "users" }, "status": 409 } ```post
<br/> ## Index 文档 Index和Create不同的地方:若是文档不存在,就索引新的文档。不然现有的文档会被删除,新的文档被索引,版本信息+1。使用`PUT index_name/_doc/_id`。 ``` PUT users/_doc/1 { "user" : "Mike" } ``` ``` #返回结果 { "_index" : "users", "_type" : "_doc", "_id" : "1", "_version" : 3, #版本增长 "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 4, "_primary_term" : 2 } ```性能
<br/> ## Update 文档 Update方法不会删除原来的文档,而是实现真正的数据更新,更新的文档必须存在,更新的内容须要包含在`doc`中。 ``` #更新文档API POST index_name/_update/_id { "doc":{ "field1":"value1", "field2":"value2" } } ```学习
#更新_id=1文档 POST users/_update/1 { "doc":{ "post_date" : "2019-05-15T14:12:12", "message" : "trying out Elasticsearch" } }
<br/> ## Get 文档 根据文档ID,获取相应文档信息,`GET index_name/_doc/_id` ``` #Get the document by ID GET users/_doc/1 ``` ``` #返回结果 { "_index" : "users", "_type" : "_doc", "_id" : "1", "_version" : 1, "_seq_no" : 2, "_primary_term" : 1, "found" : true, "_source" : { "user" : "Jack", "post_date" : "2019-05-15T14:12:12", "message" : "trying out Elasticsearch" } } ```ui
<br/> ## Delete 文档 根据文档ID,删除相应文档信息,`DELETE index_name/_doc/_id` ``` # 删除文档 DELETE users/_doc/1 ```url
<br/> ## 批量操做-bulk 批量操做,能够减小网络链接所产生的开销,提升性能。 * 支持在一次API调用中,对不一样的索引进行操做。 * 支持四种类型操做:`Index`,`Create`,`Update`,`Delete`。 * 能够在URI中指定Index,也能够在请求中指定。 * 操做中单条操做失败,并不会影响其余操做。 * 返回结果包括了每一条操做执行的结果。 * 不要发送过多数据,通常建议是1000-5000个文档,若是你的文档很大,能够适当减小队列,大小建议是5-15MB,默认不能超过100M,会报错。spa
### Bulk 操做 POST _bulk { "index" : { "_index" : "test", "_id" : "1" } } { "field1" : "value1" } { "delete" : { "_index" : "test", "_id" : "2" } } { "create" : { "_index" : "test2", "_id" : "3" } } { "field1" : "value3" } { "update" : {"_id" : "1", "_index" : "test"} } { "doc" : {"field2" : "value2"} }
#返回结果 { "took" : 227, "errors" : false, "items" : [ { "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 0, "_primary_term" : 1, "status" : 201 } }, { "delete" : { "_index" : "test", "_type" : "_doc", "_id" : "2", "_version" : 1, "result" : "not_found", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1, "status" : 404 } }, { "create" : { "_index" : "test2", "_type" : "_doc", "_id" : "3", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 0, "_primary_term" : 1, "status" : 201 } }, { "update" : { "_index" : "test", "_type" : "_doc", "_id" : "1", "_version" : 2, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 2, "_primary_term" : 1, "status" : 200 } } ] }
<br/> ## 批量读取-mget mget 是经过文档`_id`列表获得文档信息。 ``` ### mget 操做 GET /_mget { "docs" : [ { "_index" : "test", "_id" : "1" }, { "_index" : "test", "_id" : "2" } ] }.net
#URI中指定index GET /test/_mget { "docs" : [ { "_id" : "1" }, { "_id" : "2" } ] }code
GET /_mget { "docs" : [ { "_index" : "test", "_id" : "1", "_source" : false }, { "_index" : "test", "_id" : "2", "_source" : ["field3", "field4"] }, { "_index" : "test", "_id" : "3", "_source" : { "include": ["user"], "exclude": ["user.location"] } } ] }索引
#返回结果 { "docs" : [ { "_index" : "test", "_type" : "_doc", "_id" : "1", "_version" : 4, "_seq_no" : 5, "_primary_term" : 1, "found" : true, "_source" : { "field1" : "value1", "field2" : "value2" } }, { "_index" : "test", "_type" : "_doc", "_id" : "2", "found" : false } ] }
<br/> ## 批量查询-msearch msearch 是根据查询条件,搜索到相应文档。
POST kibana_sample_data_ecommerce/_msearch {} {"query" : {"match_all" : {}},"size":1} {"index" : "kibana_sample_data_flights"} {"query" : {"match_all" : {}},"size":2}
<br/> ## 常见错误返回说明 问题|缘由 ---|:-- 没法链接|网络故障或集群挂了 链接没法关闭|网络故障或节点出错 429|集群过于繁忙 4xx|请求体格式有错 500|集群内部错误