GET API是Elasticsearch中经常使用的操做,通常用于验证文档是否存在;或者执行CURD中的文档查询。与检索不一样的是,GET查询是实时查询,能够实时查询到索引结果。而检索则是须要通过处理,通常默认是1秒钟吧...才能搜索到。合理利用这些方法,能够更灵活的使用Elasticsearch。
更多内容参考ELK教程html
阅读这篇文档,发现本身对不少地方不是很理解。好比存储机制、版本维护等等。暂时先作为阶段性的学习吧...后续更新在回来补补....网络
Get API容许基于ID字段从Elasticsearch查询JSON文档,下面就是一个查询的例子:session
curl -XGET 'http://localhost:9200/twitter/tweet/1'
上面的命令表示,在twitter索引的tweet类型中查询id为1的文档,返回结果以下:app
{ "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_version" : 1, "found": true, "_source" : { "user" : "kimchy", "postDate" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch" } }
上面返回的数据包括文档的基本内容,_index
是索引名称,_type
是类型,_id
是ID,_version
是版本号。_source
字段包括了文档的基本内容;found
字段表明是否找到。curl
这个API支持使用HEAD方式提交,这样能够验证这个ID是否存在,而不会返回无用的数据。分布式
curl -XHEAD -i 'http://localhost:9200/twitter/tweet/1'
默认状况下get API是实时的,并不会受到索引的刷新频率的影响。(也就是说,只要索引的数据,就能够立马查询到)post
有的时候咱们可能想要关闭实时查询,这样能够设置realtime=false。也能够在配置文件中配置,使之全局可用,即配置action.get.realtime为false。性能
When getting a document, one can specify fields to fetch from it. They will, when possible, be fetched as stored fields (fields mapped as stored in the mapping). When using realtime GET, there is no notion of stored fields (at least for a period of time, basically, until the next flush), so they will be extracted from the source itself (note, even if source is not enabled). It is a good practice to assume that the fields will be loaded from source when using realtime GET, even if the fields are stored.当查询文档的时候,能够从文档中获取特定的字段。通常来讲这些字段多是被存储的。当咱们使用实时GET查询的时候,就会忽略这些存储的字段,直接从source里面拿到字段数据。---- 我的不是很理解这段,因而把原文贴上来,要是理解错误,还请指正。学习
记得映射类型中,字段有几个属性,类型、是否被存储、是否被分析,我猜测上面指的应该就是这个被存储吧。也就是说,GET查询的时候并不会从这些存储的字段中查数据,而是直接从source中查询。那么这些存储的字段使用来干吗的呢?暂且记下....说不定之后整理的文档中会遇到!fetch
API中类型_type是可选的,若是想要查询全部的类型,能够直接指定类型为_all
,从而匹配全部的类型。
默认状况下get操做会返回_source字段,除非你使用了fields
字段或者禁用了_source
字段。经过设置_source
属性,能够禁止返回source内容:
curl -XGET 'http://localhost:9200/twitter/tweet/1?_source=false'
若是想要返回特定的字段,可使用_source_include
或者_source_exclude
进行过滤。可使用逗号分隔来设置多种匹配模式,好比:
curl -XGET 'http://localhost:9200/twitter/tweet/1?_source_include=*.id&_source_exclude=entities'
若是但愿返回特定的字段,也能够直接写上字段的名称:
curl -XGET 'http://localhost:9200/twitter/tweet/1?_source=*.id,retweeted'
get操做容许设置fields字段,返回特定的字段:
curl -XGET 'http://localhost:9200/twitter/tweet/1?fields=title,content'
若是请求的字段没有被存储,那么他们会从source中分析出来,这个功能也能够用source_filter来替代。
元数据好比_routing
和_parent
是永远不会被返回的。
Also only leaf fields can be returned via the field option. So object fields can’t be returned and such requests will fail.只有叶子字段才能经过field选项返回.因此对象字段这种是不能返回的,这种请求也会失败。
若是在执行完索引操做,没有刷新,那么GET操做会读取translog的内容来查询文档。然而有一些字段仅仅是在索引的时候产生的。若是你尝试读取索引中的生成的字段,就会出现错误。能够设置ignore_erros_on_generated_fields=true
来忽略错误。
其实我的也不太理解这个生成字段是什么意思?
不过这个Translog比较有意思,是在文档的后面才有介绍。就是索引的数据要进行存储,那么总不可能索引一条就更新一次Lucene结构吧。因此就搞了个translog,数据的变更会先放在translog里面,再刷新到es中。实时查询,实际上是读取了translog中,还未持久化的数据。
使用/{index}/{type}/{id}/_source能够仅仅返回_source字段,而没必要返回过多没必要要的信息,浪费网络带宽。
curl -XGET 'http://localhost:9200/twitter/tweet/1/_source'
也可使用过滤机制:
curl -XGET 'http://localhost:9200/twitter/tweet/1/_source?_source_include=*.id&_source_exclude=entities'
也是支持使用HEAD方式,验证是否存在:
curl -XHEAD -i 'http://localhost:9200/twitter/tweet/1/_source'
当索引的时候指定了路由,那么查询的时候就必定要指定路由。
curl -XGET 'http://localhost:9200/twitter/tweet/1?routing=kimchy'
若是路由信息不正确,就会查找不到文档
控制为get请求维护一个分片的索引,这个索引能够设置为:
refresh参数可让每次get以前都刷新分片,使这个值能够被搜索。设置true的时候,尽可能要考虑下性能问题,由于每次刷新都会给系统带来必定的压力
get操做会经过特定的哈希方法,把请求分配给特定的分片进行查询。因为在分布式的环境下,主分片和备份分片做为一个组,均可以支持get请求。这就意味着,分片的数量越多,get执行的规模就越大。
You can use the version parameter to retrieve the document only if it’s current version is equal to the specified one. This behavior is the same for all version types with the exception of version type FORCE which always retrieves the document.你可使用version参数检索文档,不过version参数的值必须等于当前版本号。当版本类型为FORCE的时候,全部的版本类型均可以检索文档。
关于es的版本号,理解的真是不够透彻....
在ES的内部,会给那些被删除或者被整个替换的文档打上一个标记。老版本的文档并不会当即删除,固然你也不能访问到它。ES会在后台清理,以便能有更多的空间索引数据。