索引中最基本的单元叫作文档 document. 在es中文档的示例以下:web
{ "_index": "questions", "_type": "baichebao", "_id": "4", "_score": 1, "_version" : 1, "_source": { "id": 4, "content": "汽车常见故障的解决办法有哪些?", "uid": 1, "all_answer_count": 2, "series_id": 0, "score": 0, "answer_count": 2 } }
文档中下划线开头的是es自带的字段并发
这里的索引,类型,文档,字段的概念不少文章都作一个关系型数据的对比。curl
我如今有一个user表,这个user表有个type字段,0/1表明是男仍是女,这个表的每条数据就表明一我的,它拥有名称,电话等属性。elasticsearch
对应于es,表就至关于索引,男女的字段至关于type,每条数据就是一个document,名称电话等属性就是一个字段。ui
上面能够看到es的文档中有个_version字段,当两个并发请求要修改文档的时候,es使用的是乐观锁。
在es中,更新请求其实是分为两个阶段,获取文档,修改文档,而后保存文档。
那么当两个更新请求同时要修改文档的时候,系统乐观的认为不会有两个并发请求对一个系统操做。this
文档本来的版本为1,请求A获取了version为1的文档,请求B也获取了version为1的文档,而后请求A修改完文档后,而且先执行了保存操做,这个时候,系统中的文档version变为了2。
这个时候,B再执行保存操做的时候,告诉系统我要修改version为1的文档。系统就会抛出一个错误,说文档版本不匹配。而后这个错误由应用程序本身来进行控制。url
这种机制在请求量大的时候会比悲观锁机制好。可是缺点是须要程序处理版本冲突错误,可能通常的方法是封装更新操做,而且设置重复重试次数。版本控制
POST /website/blog/ -d { id: 123, name: "blog123" }
增长操做若是制定的文档已经存在了,就会返回409错误code
DELETE /website/blog/123
若是文档没有存在,则返回404blog
PUT /website/blog/123 { "title": "My first blog entry", "text": "I am starting to get the hang of this...", "date": "2014/01/02" }
更新的时候每每有个操做就是“若是有数据,则更新,若是没有数据,则建立”
能够用upsert
curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "script" : "ctx._source.counter += count", "params" : { "count" : 4 }, "upsert" : { "counter" : 1 // 若是没有id为1的文档,则建立,而且设置counter为1 } }' curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "doc" : { "name" : "new_name" }, "doc_as_upsert" : true // 若是没有文档,则doc就是新的文档 }'
更新必须明确的一点是,es中的文档的更新操做其实是执行了两步,获取文档,更新文档,而后再保存文档。
GET /website/blog/123
若是你已经知道一批文档id了,那么你可使用批量查的功能
GET /_mget { "docs" : [ { "_index" : "website", "_type" : "blog", "_id" : 2 }, { "_index" : "website", "_type" : "pageviews", "_id" : 1, "_source": "views" } ] }