ElasticSearch 基础篇 01 - 查漏补缺 01
1、搜索 _source 数据列过滤
我们常常在 kibana 的 devTools 中书写相关的 dsl 语句,但是有时候想要过滤一些字段明明知道es 应该有这样的功能,但是就是想不起来,今天在这里汇总一下:
"_source": false // 不显示任何source字段 "_source": "obj.*" //只显示以 obj. 开头的字段 "_source": ["id", "title", "name*"] // 显示 id、title 和以 name 开头的资源 "_source": { "include": ["id", "name*"], // 显示 id,name 开头字段 "exclude": ["content", "desc_*"] // 不显示 content 和 desc_ 开头字段 }
2、为什么 scroll 查询不能做到时效性
有些场景我们一定要做到知其所以然,否则关键时刻就会懵逼。
首先我们知道,scroll 参数会告诉 Elasticsearch 应保持多长时间的搜索。这个值并不需要长到可以处理所有的数据,只要够处理前一批次结果的时间就可以了。每一个滚动请求设置一个新的有效时间。
一般来说,合并过程优化的背景是通过合并小段来创建一个新的大段来优化索引,然后再删除小段。在执行滚动期间仍可以进行索引优化,但在打开搜索上下文而且小段仍然在使用的时候回组织小段的删除。这就是为什么后来对文档的改变不会影响滚动搜索请求的结果。
提示:保持较旧的段,意味着更多的文件句柄。确保在节点中已配置访问文件句柄的参数足够用。
3、在嵌套查询中如何控制嵌套中的返回条数
在 Elasticsearch 中有嵌套结构和父子结构,常用的就是 nested 方式。在这两种结构下,返回实际匹配的内容是隐藏的。但在有些情况下,了解实际匹配的内容是非常有用的,这时就要用到隐藏内容的 inner_hits 查询了。这里大概列一下该如何进行搜索:
{ "query": { "nested": { "path": "apache", "query": { "bool": { "must":[ { "term": { "apache.method": "POST" } } ] } }, "inner_hits": { "from": 0, "size": 10 } } } }
4、常听说 es 利用乐观锁来控制事务那我该怎么获取 version
想要获取某文档当前的版本号 version,只需要在最后的参数上增加 --> "version": true , 这样就可以使得每个返回的结果之中有版本号了。
{ "version": true, "query": { "term": { "message": "POST" } } }
5、如何高效准确的验证某个条件是否有数据
我们常常第一就能想到使用 _count 的方式来验证某个查询条件是否有数据,但是 _count 也还是会去统计总数量的,相对来说在性能上不是最优的。
最优的解决方式通过以下方式:
一个查询语句中,设置 size=0 并增加 terminate_after = 1 ,这个时候就可以很高效的验证查询是否有结果了。(这个就是只要检测到有一条数据就返回,类似于断言的方式)
{ "query": {......}, "size": 0, "terminate_after": 1 }
6、如何简单高效的验证某个 queryDSL 是否正确
这种需求一般常见于搜索管理平台上,增加这么一个验证接口的先验条件,只有通过了验证才能进一步的往下执行。
这种验证方式可以不用实际执行,提高效率,防止误操作。方式是使用 _validate 接口来验证
GET index/_validate { "query": { ...... } }