Elasticsearch的增删改查操作

检索文档

GET请求

GET请求返回的响应内容包括 {"found": true} 。这意味着文档已经找到。如果我们请求一个不存在的文档,依旧会得到一个JSON,不过 found 值变成了 false 。

通常, GET 请求将返回文档的全部,存储在 _source 参数中。但是可能你感兴趣的字段只是 title 。请求个别字段可以使用 _source 参数。多个字段可以使用逗号分隔:(GET/website/blog/123/_source=title,text)

{

    "_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

检索文档的一部分

通常, GET 请求将返回文档的全部,存储在 _source 参数中。但是可能你感兴趣的字段只是 title 。请求个别字段可以使用 _source 参数。多个字段可以使用逗号分隔:

GET /website/blog/123?_source=title,text   (此时返回元数据信息和source中的title和text字段信息)

或者你只想得到 _source 字段而不要其他的元数据,你可以这样请求:

GET /website/blog/123/_source (此时只返回source内的信息,不包含元数据信息)

检查文档是否存在

如果你想做的只是检查文档是否存在——你对内容完全不感兴趣——使用 HEAD 方法来代替 GET 。 HEAD 请求不会返回响应体,只有HTTP头:

如果不存在返回 404 Not Found :

创建一个新文档

当索引一个文档,我们如何确定是完全创建了一个新的还是覆盖了一个已经存在的呢?

1:最简单的方法是使用 POST 方法让Elasticsearch自动生成唯一 _id :

2.使用PUT方法,但需要在URL后加 /_create 做为端点:

删除文档

删除文档的语法模式与之前基本一致,只不过要使用 DELETE 方法:

如果文档被找到,Elasticsearch将返回 200 OK 状态码和以下响应体。注意 _version 数字已经增加了。

如果文档未找到,我们将得到一个 404 Not Found 状态码,响应体是这样的:

尽管文档不存在—— "found" 的值是 false —— _version 依旧增加了。这是内部记录的一部分,它确保在多节点间不同操作可以有正确的顺序。因为删除一个文档也不会立即从磁盘上移除,它只是被标记成已删除。Elasticsearch将会在你之后添加更多索引的时候才会在后台进行删除内容的清理。

文档更新

文档更新

文档在Elasticsearch中是不可变的——我们不能修改他们。如果需要更新已存在的文档,我们可以使用index API 重建索引(reindex) 或者替换掉它。替换后可以看到版本号(version)增加了。

在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档。旧版本文档不会立即消失,但你也不能去访问它。Elasticsearch会在你继续索引更多数据时清理被删除的文档.这个过程如下:

1. 从旧文档中检索JSON

2. 修改它

3. 删除旧文档

4. 索引新文档

文档局部更新

ElasticSearch中文档是不可变的——它们不能被更改,只能被替换。update API也是遵循该规则的,表面上看,我们似乎是局部更新了文档的位置,但其内部却一样通过重建索引(检索-->修改-->删除就文档-->索引新文档)的流程。

最简单的update请求接受一个局部文档参数doc,它会合并到现有文档中,已存在的字段将会被覆盖,新的字段将会被添加。

查询结果:

注:更新用的是POST请求,GET请求可能会报错;

使用脚本局部更新

当API不能满足要求时,Elasticsearch允许你使用脚本实现自己的逻辑。脚本支持非常多的API,例如搜索、排序、聚合和文档更新。脚本可以通过请求的一部分、检索特殊的 .scripts 索引或者从磁盘加载方式执行。

默认的脚本语言是Groovy,一个快速且功能丰富的脚本语言,语法类似于Javascript。

脚本能够使用 update API改变 _source 字段的内容,它在脚本内部以 ctx._source 表示。例如,我们可以使用脚本增加或减少员工的 age 数量:

我们还可以使用脚本增加一个新标签到数组中。

POST /megacorp/employee/1/_update

{

"script" : "ctx._source.interests+=new_interest",

"params" : {

"new_interest" : "search"

}

}

更新可能不存在的文档

想象我们要在Elasticsearch中存储浏览量计数器。每当有用户访问页面,我们增加这个页面的浏览量。但如果这是个新页面,我们并不确定这个计数器存在与否。当我们试图更新一个不存在的文档,更新将失败。

在这种情况下,我们可以使用 upsert 参数定义文档来使其不存在时被创建。

查询结果:

第一次执行这个请求, upsert 值被索引为一个新文档,初始化 age字段为 1 .接下来文档已经存在,所以 script 被更新代替,增加 age数量。

如果第二次再执行一次这样的一个脚本程序,由于文档已存在,所以此次操作的是一个已存在的文档更新。

查询结果:

猜你喜欢

转载自blog.csdn.net/zhtzh312/article/details/88862986