一、检索文档
1.1 检索文档的一部分
通常, GET 请求将返回文档的全部, 存储在 _source 参数中。 但是可能你感兴趣的字段只是 title 。 请求个别字段可以使
用 _source 参数。 多个字段可以使用逗号分隔:
GET /website/blog/123?_source=title,text
_source 字段现在只包含我们请求的字段, 而且过滤了 date 字段:
{
"_index":"website",
"_type":"blog",
"_id":"123",
"_version":1,
"exists":true,
"_source":{
"title":"My first blog entry",
"text":"Just trying this out..."
}
}
或者你只想得到 _source 字段而不要其他的元数据, 你可以这样请求:
GET /website/blog/123/_source
它仅仅返回:
{
"title": "My first blog entry",
"text": "Just trying this out...",
"date": "2014/01/01"
}
1.2 创建一个新文档
当索引一个文档, 我们如何确定是完全创建了一个新的还是覆盖了一个已经存在的呢?
请记住 _index 、 _type 、 _id 三者唯一确定一个文档。 所以要想保证文档是新加入的, 最简单的方式是使用 POST 方法让
Elasticsearch自动生成唯一 _id :
POST /website/blog/
{ ... }
然而, 如果想使用自定义的 _id , 我们必须告诉Elasticsearch应该在 _index 、 _type 、 _id 三者都不同时才接受请求。 为了
做到这点有两种方法, 它们其实做的是同一件事情。 你可以选择适合自己的方式:
第一种方法使用 op_type 查询参数:
PUT /website/blog/123?op_type=create
{ ... }
或者第二种方法是在URL后加 /_create 做为端点:
PUT /website/blog/123/_create
{ ... }
如果请求成功的创建了一个新文档, Elasticsearch将返回正常的元数据且响应状态码是 201 Created 。
另一方面, 如果包含相同的 _index 、 _type 和 _id 的文档已经存在, Elasticsearch将返回 409 Conflict 响应状态码, 错误信
息类似如下:
{
"error" : "DocumentAlreadyExistsException[[website][4] [blog][123]:
document already exists]",
"status" : 409
}
1.3 删除文档
DELETE /website/blog/123
正如在《更新文档》 一章中提到的, 删除一个文档也不会立即从磁盘上移除, 它只是被标记成已删除。 Elasticsearch将会在你之后添加更多索引的时候才会在后台进行删除内容的清理。
1.4 处理冲突
1.4.1 乐观并发控制
Elasticsearch使用这个 _version 保证所有修改都被正确排序。 当一个旧版本出现在新版本之后, 它会被简单的忽略。我们利用 _version 的这一优点确保数据不会因为修改冲突而丢失。 我们可以指定文档的 version 来做想要的更改。 如果那个
版本号不是现在的, 我们的请求就失败了。
当我们通过重新索引文档保存修改时, 我们这样指定了 version 参数:
PUT /website/blog/1?version=1 <1>
{
"title": "My first blog entry",
"text": "Starting to get the hang of this..."
}
<1> 我们只希望文档的 _version 是 1 时更新才生效。
This request succeeds, and the response body tells us that the _version has been incremented to 2 : 请求成功, 响应体告诉我们 _version 已经增加到 2 :
1.4.2 使用外部版本控制系统
Elasticsearch的查询字符串后面添加 version_type=external 来使用这些版本号。 版本号必须是整数, 大于零小于 9.2e+18 ——Java中的正的 long 。
外部版本号与之前说的内部版本号在处理的时候有些不同。 它不再检查 _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 号码为 10 :
PUT /website/blog/2?version=10&version_type=external
{
"title": "My first external blog entry",
"text": "This is a piece of cake..."
}