Elasticsearch 之数据

好风 发表于 2016-12-06T02:28:04.992886Z
引用地址:https://plus.ooclab.com/note/article/1314

文档

元数据

名字 说明
_index 文档存储的地方
_type 文档代表的对象种类
_id 文档的唯一编号

索引

创建索引

使用自有ID

PUT /{index}/{type}/{id}
{
  "field": "value",
  ...
}

使用Elasticsearch提供的自增ID

POST /website/blog/
{
  "title": "My second blog entry",
  "text":  "Still trying this out...",
  "date":  "2014/01/01"
}

注意 自增ID请求使用 POST 方法代替 PUT (从 RESTFul 语义方面来说,这很好理解)

Get

获取先前创建的文档:

GET /website/blog/123?pretty

获取指定文档的部分字段:

GET /website/blog/123?_source=title,text

只需要_source内容:

GET /website/blog/123/_source

Exist

检查文档是否存在,可以:

curl -i -XHEAD /website/blog/123

Update

更新文档,即是重建:

PUT /website/blog/123
{
  "title": "My first blog entry",
  "text":  "I am starting to get the hang of this...",
  "date":  "2014/01/02"
}

Create

_index , _type 以及 _id 组成了唯一的文档标记,所以为了确定我们创建的是全新的内容,最简单的方法就是使用POST方法,让Elasticsearch自动创建不同的 _id

POST /website/blog/

如果我们已经有了 _id , 可以这样创建:

PUT /website/blog/123?op_type=create

或者这样创建:

PUT /website/blog/123/_create

如果成功创建了新的文档,Elasticsearch将会返回常见的元数据以及201 Created的HTTP反馈码。

而如果存在同名文件,Elasticsearch将会返回一个409 Conflict的HTTP反馈码。

Delete

删除文档:

DELETE /website/blog/123

版本控制

乐观并发控制

我们更新文档时,指定先前获取的 version :

PUT /website/blog/1?version=1 <1>
{
  "title": "My first blog entry",
  "text":  "Starting to get the hang of this..."
}

这样,如果其他人修改了这个文档,其 version 一定发生变化。那么此次更新就出错,避免并行处理出现冲突。

使用外部系统的版本

Elasticsearch在处理外部版本号时会与对内部版本号的处理有些不同。 它不再是检查_version是否与请求中指定的数值相同,而是检查当前的 _version是否比指定的数值小。如果请求成功,那么外部的版本号就会 被存储到文档中的_version中。

PUT /website/blog/2?version=5&version_type=external
{
  "title": "My first external blog entry",
  "text":  "Starting to get the hang of this..."
}

更新时,version 就必须大于5:

PUT /website/blog/2?version=10&version_type=external
{
  "title": "My first external blog entry",
  "text":  "This is a piece of cake..."
}

如果 version 不大于5就会出错

更新部分数据

Elasticsearch 文档不可以被修改,只能被替换掉

为文档添加新属性及值:

POST /website/blog/1/_update
{
   "doc" : {
      "tags" : [ "testing" ],
      "views": 0
   }
}

使用脚本更新

POST /website/blog/1/_update
{
   "script" : "ctx._source.views+=1"
}
POST /website/blog/1/_update
{
   "script" : "ctx._source.tags+=new_tag",
   "params" : {
      "new_tag" : "search"
   }
}
POST /website/blog/1/_update
{
   "script" : "ctx.op = ctx._source.views == count ? 'delete' : 'none'",
    "params" : {
        "count": 1
    }
}

更新文档时,如果指定字段不存在,可以用 upsert 保证其会被创建,并初始化:

POST /website/pageviews/1/_update
{
   "script" : "ctx._source.views+=1",
   "upsert": {
       "views": 1
   }
}

获取多个文档

一次获取多个文档:

GET /_mget
{
   "docs" : [
      {
         "_index" : "website",
         "_type" :  "blog",
         "_id" :    2
      },
      {
         "_index" : "website",
         "_type" :  "pageviews",
         "_id" :    1,
         "_source": "views"
      }
   ]
}

可以将重复参数放在 URL 中:

GET /website/blog/_mget
{
   "docs" : [
      { "_id" : 2 },
      { "_type" : "pageviews", "_id" :   1 }
   ]
}

如果文档 index 和 type 都一样,直接请求中使用 ids 即可:

GET /website/blog/_mget
{
   "ids" : [ "2", "1" ]
}

bulk

批量执行

bulk请求主体格式:

{ action: { metadata }}\n
{ request body        }\n
{ action: { metadata }}\n
{ request body        }\n
POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title":    "My first blog post" }
{ "index":  { "_index": "website", "_type": "blog" }}
{ "title":    "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} }

可以在 URL 中提供相关默认参数:

POST /website/log/_bulk
{ "index": {}}
{ "event": "User logged in" }
{ "index": { "_type": "blog" }}
{ "title": "Overriding the default type" }