检索文档
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头:
当索引一个文档,我们如何确定是完全创建了一个新的还是覆盖了一个已经存在的呢?
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会在你继续索引更多数据时清理被删除的文档.这个过程如下:
ElasticSearch中文档是不可变的——它们不能被更改,只能被替换。update API也是遵循该规则的,表面上看,我们似乎是局部更新了文档的位置,但其内部却一样通过重建索引(检索-->修改-->删除就文档-->索引新文档)的流程。
最简单的update请求接受一个局部文档参数doc,它会合并到现有文档中,已存在的字段将会被覆盖,新的字段将会被添加。
当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数量。