Elasticsearch增删改查 之 —— Get查询
GET API是Elasticsearch中常用的操作,一般用于验证文档是否存在;或者执行CURD中的文档查询。与检索不同的是,GET查询是实时查询,可以实时查询到索引结果。而检索则是需要经过处理,一般默认是1秒钟吧...才能搜索到。合理利用这些方法,可以更灵活的使用Elasticsearch。
更多内容参考ELK教程
阅读这篇文档,发现自己对很多地方不是很理解。比如存储机制、版本维护等等。暂时先做为阶段性的学习吧...后续更新在回来补补....
查询样例
Get API允许基于ID字段从Elasticsearch查询JSON文档,下面就是一个查询的例子:
curl -XGET 'http://localhost:9200/twitter/tweet/1'
上面的命令表示,在twitter索引的tweet类型中查询id为1的文档,返回结果如下:
{
"_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字段代表是否找到。
这个API支持使用HEAD方式提交,这样可以验证这个ID是否存在,而不会返回无用的数据。
curl -XHEAD -i 'http://localhost:9200/twitter/tweet/1'
实时
默认情况下get API是实时的,并不会受到索引的刷新频率的影响。(也就是说,只要索引的数据,就可以立马查询到)
有的时候我们可能想要关闭实时查询,这样可以设置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中查询。那么这些存储的字段使用来干嘛的呢?暂且记下....说不定以后整理的文档中会遇到!
类型可选
API中类型_type是可选的,如果想要查询所有的类型,可以直接指定类型为_all,从而匹配所有的类型。
source过滤
默认情况下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选项返回.所以对象字段这种是不能返回的,这种请求也会失败。
Generated fields
如果在执行完索引操作,没有刷新,那么GET操作会读取translog的内容来查询文档。然而有一些字段仅仅是在索引的时候产生的。如果你尝试读取索引中的生成的字段,就会出现错误。可以设置ignore_erros_on_generated_fields=true来忽略错误。
其实个人也不太理解这个生成字段是什么意思?
不过这个Translog比较有意思,是在文档的后面才有介绍。就是索引的数据要进行存储,那么总不可能索引一条就更新一次Lucene结构吧。所以就搞了个translog,数据的变动会先放在translog里面,再刷新到es中。实时查询,其实是读取了translog中,还未持久化的数据。
仅返回_source
使用/{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'
如果路由信息不正确,就会查找不到文档
Preference
控制为get请求维护一个分片的索引,这个索引可以设置为:
- _primary 这个操作仅仅会在主分片上执行。
- _local 这个操作会在本地的分片上执行。
- Custom (string) value 用户可以自定义值,对于相同的分片可以设置相同的值。这样可以保证不同的刷新状态下,查询不同的分片。就像sessionid或者用户名一样。
刷新
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会在后台清理,以便能有更多的空间索引数据。
Elasticsearch增删改查 之 —— Get查询的更多相关文章
- SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学、字符串、日期时间)函数[转]
SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学.字符串.日期时间)函数 --创建表格 create table aa ( UserName varchar(50 ...
- Elasticsearch增删改查 之 —— mget多文档查询
之前说过了针对单一文档的增删改查,基本也算是达到了一个基本数据库的功能.本篇主要描述的是多文档的查询,通过这个查询语法,可以根据多个文档的查询条件,返回多个文档集合. 更多内容可以参考我整理的ELK文 ...
- elasticsearch增删改查crudp-----1
Elasticsearch一些增删改查的总结 环境Centos7+Es 5.x 简单介绍下ES的原理: 1,索引 --相当于传统关系型数据库的database或schema 2,类型 --相当于传 ...
- 【gridview增删改查】数据库查询后lodop打印
ASP.NET中使用gridview可以很容易的把需要的数据动态显示在前台,还可以在表格里加入列进行增删改查,每次点击的时候重新加载数据,gridview也提供了分页等功能,还有一些模版让显示在前台的 ...
- elasticsearch 增删改查底层原理
elasticsearch专栏:https://www.cnblogs.com/hello-shf/category/1550315.html 一.预备知识 在对document的curd进行深度分析 ...
- 增删改查- 万能map- 模糊查询
1.编写接口 2.编写对应的mapper种的sql语句 3.测试 接口 public interface UserDao { List<User> getUserList(); //根据I ...
- ES 17 - (底层原理) Elasticsearch增删改查索引数据的过程
目录 1 增删改document的流程 1.1 协调节点 - Coordinating Node 1.2 增删改document的流程 2 查询document的流程 1 增删改document的流程 ...
- LINQ的增删改查写法&&组合查询
.ToList();//返回一个集合,包含查到的所有值: .First();//返回查到的第一条数据,如果查不到会报错: .FirstOrDefault();返回查到的第一条数据,差不到返回一个nul ...
- JDBC 增删改查代码 过滤查询语句
package test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; i ...
随机推荐
- WebView一般用法总结
下面是webview常规的用法: import android.annotation.SuppressLint;import android.app.Activity;import android.o ...
- Java多线程6:synchronized锁定类方法、volatile关键字及其他
同步静态方法 synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁.看一下例子,注意一下printC()并不是一个静态方法: public ...
- web前端工程师在移动互联网时代里的地位问题
支付宝十周年推出了一个新产品:支付宝的十年账单,我也赶个时髦查看了一下我的支付宝十年账单,哎,感慨自己真是太屌丝了,不过这只是说明我使用淘宝少了,当我大规模网上购物时候,我很讨厌慢速的快递,所以我大部 ...
- 探求网页同步提交、ajax和comet不为人知的秘密(中篇)
深入研究某项技术,了解使用这些技术的细节,其实最终目的都是为了完成一个选择问题:当我们要使用这些技术解决某个具体的问题时候我们到底该如何去选择.如果碰到有两种技术可以让我们达到同样的目的,我们就会不自 ...
- jquery插件:仿百度首页可展开收起的消息提示控件
消息提示插件大伙并不陌生了,无论是个系统还是网站,基本都要有消息系统.但我认为,一个好的提示插件应当具备很好的独立性,不与页面其他元素发生任何关系,其次是能对外提供丰富的接口,因为你生来就是被别人来调 ...
- [源码]NumberToUpper 数字转中文
使用时需开启unsafe选项 构造函数有4个参数 number : 数字文本 isSimplified : 是否只使用简体中文,默认:false isMoney : 是否是金额模式(忽略小数点后3位, ...
- 细说.NET中的多线程 (五 使用信号量进行同步)
上一节主要介绍了使用锁进行同步,本节主要介绍使用信号量进行同步 使用EventWaitHandle信号量进行同步 EventWaitHandle主要用于实现信号灯机制.信号灯主要用于通知等待的线程.主 ...
- 可拖动的DIV续
之前写过一篇可拖动的DIV讲如何实现可拖动的元素,最后提出了几点不足,这篇文章主要就是回答着三个问题 1. 浏览器兼容性 2. 边界检查 3. 拖动卡顿.失灵 先附上上次代码 <!DOCTYPE ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题
从这篇文章中我们已经了解了微信公众平台消息传递的方式,这种方式有一个先天的缺陷:不同用户的请求都来自同一个微信服务器,这使得常规的Session无法使用(始终面对同一个请求对象,况且还有对方服务器Co ...
- Linux常用命令(转)
源自:http://www.linuxidc.com/Linux/2011-08/40437.htm Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内 ...