上面说了POST关键字,可以实现不指定id就完成document的插入, POST + _update关键字可以实现更新的操作
POST /customer/_doc/1/_update?pretty { "doc": { "name": "changwu" } }**POST+_update进行更新的动作依然需要执行id, 但是它相对于PUT来说,当使用POST进行更新时,id不存在的话会报错,而PUT则会认为这是在新增**
此外: 针对这种更新操作,ES会先删除原来的doc,然后插入这个新的doc
document api multi-index & multi-type检索所有索引下面的所有数据
/_search搜索指定索引下的所有数据
/index/_search更多模式
/index1/index2/_search /*1/*2/_search /index1/index2/type1/type2/_search /_all/type1/type2/_search _mget api 批量查询在docs中指定_index,_type,_id
GET /_mget { "docs" : [ { "_index" : "test", "_type" : "_doc", "_id" : "1" }, { "_index" : "test", "_type" : "_doc", "_id" : "2" } ] }在URL中指定index
GET /test/_mget { "docs" : [ { "_type" : "_doc", "_id" : "1" }, { "_type" : "_doc", "_id" : "2" } ] }在URL中指定 index和type
GET /test/type/_mget { "docs" : [ { "_id" : "1" }, { "_id" : "2" }在URL中指定index和type,并使用ids指定id范围
GET /test/type/_mget { "ids" : ["1", "2"] }为不同的doc指定不同的过滤规则
GET /_mget { "docs" : [ { "_index" : "test", "_type" : "_doc", "_id" : "1", "_source" : false }, { "_index" : "test", "_type" : "_doc", "_id" : "2", "_source" : ["field3", "field4"] }, { "_index" : "test", "_type" : "_doc", "_id" : "3", "_source" : { "include": ["user"], "exclude": ["user.location"] } } ] } _bulk api 批量增删改 基本语法 {"action":{"metadata"}}\n {"data"}\n存在哪些类型的操作可以执行呢?
delete: 删除文档
create: _create 强制创建
index: 表示普通的put操作,可以是创建文档也可以是全量替换文档
update: 局部替换
上面的语法中并不是人们习惯阅读的json格式,但是这种单行形式的json更具备高效的优势
ES如何处理普通的json如下:
将json数组转换为JSONArray对象,这就意味着内存中会出现一份一模一样的拷贝,一份是json文本,一份是JSONArray对象
但是如果上面的单行JSON,ES直接进行切割使用,不会在内存中整一个数据拷贝出来
deletedelete比较好看仅仅需要一行json就ok
{ "delete" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } } create两行json,第一行指明我们要创建的json的index,type以及id
第二行指明我们要创建的doc的数据
{ "create" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } } { "field1" : "value3" } index相当于是PUT,可以实现新建或者是全量替换,同样是两行json
第一行表示将要新建或者是全量替换的json的index type 以及 id
第二行是具体的数据
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } } { "field1" : "value1" } update表示 parcial update,局部替换
他可以指定一个retry_on_conflict的特性,表示可以重试3次
POST _bulk { "update" : {"_id" : "1", "_type" : "_doc", "_index" : "index1", "retry_on_conflict" : 3} } { "doc" : {"field" : "value"} } { "update" : { "_id" : "0", "_type" : "_doc", "_index" : "index1", "retry_on_conflict" : 3} } { "script" : { "source": "ctx._source.counter += params.param1", "lang" : "painless", "params" : {"param1" : 1}}, "upsert" : {"counter" : 1}} { "update" : {"_id" : "2", "_type" : "_doc", "_index" : "index1", "retry_on_conflict" : 3} } { "doc" : {"field" : "value"}, "doc_as_upsert" : true } { "update" : {"_id" : "3", "_type" : "_doc", "_index" : "index1", "_source" : true} } { "doc" : {"field" : "value"} } { "update" : {"_id" : "4", "_type" : "_doc", "_index" : "index1"} } { "doc" : {"field" : "value"}, "_source": true} 滚动查询技术滚动查询技术和分页技术在使用场景方面还是存在出入的,这里的滚动查询技术同样适用于系统在海量数据中进行检索,比如过一次性存在10条数据被命中可以被检索出来,那么性能一定会很差,这时可以选择使用滚动查询技术,一批一批的查询,直到所有的数据被查询完成他可以先搜索一批数据再搜索一批数据
采用基于_doc的排序方式会获得较高的性能
每次发送scroll请求,我们还需要指定一个scroll参数,指定一个时间窗口,每次搜索只要在这个时间窗口内完成就ok
示例
GET /index/type/_search?scroll=1m { "query":{ "match_all":{} }, "sort":["_doc"], "size":3 }响应
{ "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAACNFlJmWHZLTkFhU0plbzlHX01LU2VzUXcAAAAAAAAAkRZSZlh2S05BYVNKZW85R19NS1Nlc1F3AAAAAAAAAI8WUmZYdktOQWFTSmVvOUdfTUtTZXNRdwAAAAAAAACQFlJmWHZLTkFhU0plbzlHX01LU2VzUXcAAAAAAAAAjhZSZlh2S05BYVNKZW85R19NS1Nlc1F3", "took": 9, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": null, "hits": [ { "_index": "my_index", "_type": "_doc", "_id": "2", "_score": null, "_source": { "title": "This is another document", "body": "This document has a body" }, "sort": [ 0 ] }, { "_index": "my_index", "_type": "_doc", "_id": "1", "_score": null, "_source": { "title": "This is a document" }, "sort": [ 0 ] } ] } }