elasticsearch文档Get API

2年前 (2022) 程序员胖胖胖虎阿
258 0 0

前面两篇文章和读者讨论了Elasticsearch中文档的索引API,本文来看Get API。

本文是Elasticsearch系列的第十篇,阅读前面的文章,有助于更好的理解本文:


1.elasticsearch安装与配置
2.初识elasticsearch中的REST接口
3.elasticsearch修改数据
4.elasticsearch文档操作
5.elasticsearch API约定(一)
6.elasticsearch API约定(二)
7.elasticsearch文档读写模型
8.elasticsearch文档索引API(一)
9.elasticsearch文档索引API(二)


Get API是一个基于文档id,从索引中获取JSON文档的API,例如如下请求表示从twitter索引中获取一个id为1的索引:

  
  
  
  1. curl -X GET "localhost:9200/twitter/_doc/1?pretty"

执行结果如下:

elasticsearch文档Get API

通过阅读前面的文章,相信大家对这个执行结果应该很熟悉了,这里的执行结果中有 _index、 _type、 _id、 _version等我们常见的信息,也有found字段表示查询的数据是否存在, _source字段则表示查询到的数据。

开发者也可以使用HEAD请求查看一个文档是否存在,如下:

  
  
  
  1. curl -I -X HEAD "localhost:9200/twitter/_doc/0

执行结果如下:

elasticsearch文档Get API

Realtime

默认情况下,Get API是实时的,并且不受index刷新率的影响(当数据对搜索可见时)。如果文档已更新但尚未刷新,则Get API将发出刷新调用以使文档可见,这也会导致其他文档发生变化。如果开发者想要禁用实时GET,可以将realtime参数设置为false。

Source filtering

默认情况下,完整的source字段将被返回,如果开发者使用了storedfields字段或者禁用了_source字段,则情况可能会发生变化,例如如下请求:

  
  
  
  1. curl -X GET "localhost:9200/twitter/_doc/1?_source=false&pretty"

执行结果如下:

elasticsearch文档Get API

如果开发者只是需要完整的一个或两个字段,则可以使用sourceinclude参数来包含字段或者使用sourceexclude参数来过滤字段,当文档中的字段比较多时,这种做法非常有用,这样还可以节省网络开销。具体用法如下:

  
  
  
  1. curl -X GET "localhost:9200/twitter/_doc/1?_source_include=user&pretty"

  
  
  
  1. curl -X GET "localhost:9200/twitter/_doc/1?_source_exclude=message&pretty"

执行结果如下:

elasticsearch文档Get API

Stored Fields

Get操作允许指定一系列的stored字段,这些字段将会在指定stored_fields参数的时候被返回,如果请求的字段没有被储存,那么将会被忽略。如下:

  
  
  
  1. curl -X PUT "localhost:9200/twitter" -H 'Content-Type: application/json' -d'

  2. {

  3.   "mappings": {

  4.      "_doc": {

  5.         "properties": {

  6.            "counter": {

  7.               "type": "integer",

  8.               "store": false

  9.            },

  10.            "tags": {

  11.               "type": "keyword",

  12.               "store": true

  13.            }

  14.         }

  15.      }

  16.   }

  17. }

  18. '

在这里我们指定了counter将不会被存储,而tags将被存储,接下来执行如下请求,添加一个文档:

  
  
  
  1. curl -X PUT "localhost:9200/twitter/_doc/1?pretty" -H 'Content-Type: application/json' -d'

  2. {

  3.    "counter" : 1,

  4.    "tags" : ["red"]

  5. }

  6. '

添加成功后,再去查询,查询时指定stored_fileds,如下:

  
  
  
  1. curl -X GET "localhost:9200/twitter/_doc/1?pretty&stored_fields=tags,counter"

执行结果如下:

elasticsearch文档Get API

可以看到,store为false的字段被忽略掉了。

另外,也可以对元数据进行检索,例如执行如下请求添加一条数据:

  
  
  
  1. curl -X PUT "localhost:9200/twitter/_doc/2?routing=user1&pretty" -H 'Content-Type: application/json' -d'

  2. {

  3.    "counter" : 1,

  4.    "tags" : ["white"]

  5. }

  6. '

添加成功后再进行查询,如下:

  
  
  
  1. curl -X GET "localhost:9200/twitter/_doc/2?pretty&routing=user1&stored_fields=tags,counter"

执行结果如下:

elasticsearch文档Get API

只有leaf字段才可以通过stored_field选项返回,如果是一个Object字段,则无法返回,并且请求会失败,报错如下:

elasticsearch文档Get API

Getting the _source directly

使用 /{index}/{type}/{id}/_source格式的请求,可以只返回一个文档的_source字段,例如如下请求:

  
  
  
  1. curl -X GET "localhost:9200/twitter/_doc/1/_source?pretty"

执行结果如下:

elasticsearch文档Get API

在此基础上,开发者可以继续使用sourcefiltering来决定要返回_source中的哪些字段,如下:

  
  
  
  1. curl -X GET "localhost:9200/twitter/_doc/1/_source?_source_include=counter&pretty"

执行结果如下:

elasticsearch文档Get API

也可以通过HEAD请求查看一个文档中的_source字段是否存在,前提是没有禁止mapping:

  
  
  
  1. curl -I -X HEAD "localhost:9200/twitter/_doc/1/_source"

执行结果如下:

elasticsearch文档Get API

Routing

开发者如果在创建索引时指定了路由,那么在获取文档时也应该指定正确的路由,如果路由设置不一致将获取不到文档。具体可以参考上篇文章,这里不再赘述。

Preference

控制副本分片去执行get请求的优先权。默认情况下,副本分片的执行时机是随机的。
preference 可以设置为:

  1. _primary:操作只在主分片执行

  2. _local:操作会优先在本地分配的分片上执行

  3. Custom(String)value:自定义值会是一个字符串,相同的字符串可以保证相同的请求被分配到同样的副本上面,进而保证同一请求结果的稳定性

Refresh

将refresh参数设置为true,可以使得在Get操作之前刷新相关的分片并使其可搜索,但是这个参数应当谨慎设置,因为它会导致系统负载过重并减慢索引速度。

Distributed

Get操作会从一个指定的分片id获得hash值,然后重定向到那个shard id所对应的分片的其中一个副本上并返回结果。副本是主分片及其在该分片ID组中的副本。这意味着我们将拥有的副本越多,我们将获得更好的GET缩放。

Versioning support

开发者可以使用version参数去检索document,在当前的version和开发者指定的version相同的情况下可以检索到文档。
在Elasticsearch内部,Elasticsearch会自动标记已经删除的旧document并且增加新的document。旧版本的document不会马上出现,开发者也不能访问。Elasticsearch会在后台清理已经删除的document以便可以索引更多的数据。

好了,本文就先说到这里,有问题欢迎留言讨论。


往期精彩回顾

Redis教程
SpringCloud教程
Git教程
MongoDB教程
SpringBoot+Vue前后端分离开源项目-微人事
SpringBoot+Vue前后端分离开源项目-V部落

elasticsearch文档Get API

本文分享自微信公众号 - 江南一点雨(a_javaboy)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

版权声明:程序员胖胖胖虎阿 发表于 2022年10月5日 上午1:56。
转载请注明:elasticsearch文档Get API | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...