1 索引一个文档(插入数据到ES中)
1.1 使用自己的id
PUT /{index}/{type}/{id} {
"field"
:
"value"
,
... }
1.2 使自增ID。
POST /website/blog/ {
"title"
:
"My second blog entry"
,
"
text"
:
"Still trying this out..."
,
"date"
:
"2014/01/01"
}
自动生成的ID有22个字符,使用的UUIDs
注:有id使用的PUT,没有时使用POST
2 检索文档:
2.1 一种是简单的通过 /{index}/{type}/{id}直接查询刚才插入的,另一种是通过DSL查询语言进行搜索。
2.2 使用_mget同时根据/{index}/{type}/{id}检索出多个文档。
或者检索出指定字段,可用_source
GET /_mget {
"docs"
: [ {
"_index"
:
"_type"
:
"_id"
:
"_index"
:
"_type"
:
"_id"
:
"_source"
:
"website"
,
"blog"
,
2
"website"
,
"pageviews"
,
1
,
"views"
}, {
} ]
}
3 更新文档:
文档更新分为更新整个文档和局部更新。
3.1 更新整个文档:因为ES中的文档是不可变的,使用下面的方法。会将之前插入的数据整个替换。
POST /website/blog/123 {
"title"
:
"new My second blog entry"
,
"
text"
:
"Still trying this out..."
,
"date"
:
"2014/01/01"
}
此时ES的返回的_version会+1,同时created为false。
3.2 局部更新。
a)更新方法(包含更新字段值、新增字段):
/
website
/blog/123/_update
{"doc":{"name":"mack"}}
该方法会更新
/
website
/blog/123
文档,若没有name自动,则会新增一个字段,若有name则会更新name。
b)实际上:对于ES更新包含以下步骤
1)检索出旧文档JSON
2)修改它
3)删除旧文档
4)索引新文档
与更新整个文档不同的是,这个过程只需要客户发送一个请求。
c)更新不存在的文档,使用upsert参数。
POST /website/pageviews/1/_update {
"script" : "ctx._source.views+=1",
"upsert": {"views": 1 }
4 删除文档
删除文档和创建类似。只是使用的DELETE的方法:
DELETE /website/blog/123。
5 更新冲突问题。
比如有两个进程处理订单。
在数据库中通过悲观并发控制(Pessimistic concurrency control)和乐观并发控制
Optimistic concurrency control
悲观并发控制:关系型数据库中使用,为了解决冲突,在读取的时候就锁定该行数据,并确保只有枷锁的线上可以修改该行数据。
乐观并发控制:ES中使用。假设冲突不经常发生,
ES通过_version来控制所有修改都被正确排序。
除了使用_version来控制版本外,也可以使用外部版本控制系统。即外部版本号,比如在使用数据库作为主库,而ES只是作为搜索数据,主库有类似timestamp可以用于版本控制的字段。在查询字段后面添加version_type=external来使用这些版本号。
比如:
现 们 这
version
为
10
PUT /website/blog/
2
?version=
10
&version_type=external {
"title"
:
"My first external blog entry"
,
"text"
:
"This is a piece of cake..."
}
6 使用bulk同时批量操作文档:创建、删除、更新。
6.1)语法:
action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
......
a)删除
{
"delete"
: {
"_index"
:
"website"
,
"_type"
:
"blog"
,
"_id"
:
"123"
}}
b)创建:
{
"create"
: {
"_index"
:
"website"
,
"_type"
:
"blog"
,
"_id"
:
"123"
}} {
"title"
:
"My first blog post"
}
c)更新:
d)上述请求放在一起:
请求结果会将每个处理结果放在一起返回.