【转】elasticsearch的查询器query与过滤器filter的区别
很多刚学elasticsearch的人对于查询方面很是苦恼,说实话es的查询语法真心不简单… 当然你如果入门之后,会发现elasticsearch的rest api设计是多么有意思。
说正题,elasticsearch的查询有两部分组成:query and filter 。
下面是官方的query vs filter的介绍,其实说的也是不明不白的.
https://www.elastic.co/guide/en/elasticsearch/guide/current/_queries_and_filters.html
文章会后续更新,如果文章被转走了,请到原文地址瞅瞅: http://xiaorui.cc/?p=2317
Query查询器 与 Filter 过滤器
尽管我们之前已经涉及了查询DSL,然而实际上存在两种DSL:查询DSL(query DSL)和过滤DSL(filter DSL)。
过滤器(filter)通常用于过滤文档的范围,比如某个字段是否属于某个类型,或者是属于哪个时间区间
* 创建日期是否在2014-2015年间?
* status字段是否为success?
* lat_lon字段是否在某个坐标的10公里范围内?
查询器(query)的使用方法像极了filter,但query更倾向于更准确的查找。
* 与full text search的匹配度最高
* 正则匹配
* 包含run单词,如果包含这些单词:runs、running、jog、sprint,也被视为包含run单词
* 包含quick、brown、fox。这些词越接近,这份文档的相关性就越高
查询器会计算出每份文档对于某次查询有多相关(relevant),然后分配文档一个相关性分数:_score。而这个分数会被用来对匹配了的文档进行相关性排序。相关性概念十分适合全文搜索(full-text search),这个很难能给出完整、“正确”答案的领域。
query filter在性能上对比:filter是不计算相关性的,同时可以cache。因此,filter速度要快于query。
下面是使用query语句查询的结果,第一次查询用了300ms,第二次用了280ms.
Python
#blog: http://xiaorui.cc
{
"size": 1,
"query": {
"bool": {
"must": [
{
"terms": {
"keyword": [
"手机",
"iphone"
]
}
},
{
"range": {
"cdate": {
"gt": "2015-11-09T11:00:00"
}
}
}
]
}
}
} {
"took": 51,
"timed_out": false,
"_shards": {
"total": 30,
"successful": 30,
"failed": 0
},
"hits": {
"total": 6818,
"max_score": 0,
"hits": []
}
}
#blog: http://xiaorui.cc
{
"size":1,
"query":{
"bool":{
"must":[
{
"terms":{
"keyword":[
"手机",
"iphone"
]
}
},
{
"range":{
"cdate":{
"gt":"2015-11-09T11:00:00"
}
}
}
]
}
}
}
{
"took":51,
"timed_out":false,
"_shards":{
"total":30,
"successful":30,
"failed":0
},
"hits":{
"total":6818,
"max_score":0,
"hits":[]
}
}
下面是使用filter查询出来的结果,第一次查询时间是280ms,第二次130ms…. 速度确实快了不少,也证明filter走了cache缓存。 但是如果我们对比下命中的数目,query要比filter要多一点,换句话说,更加的精准。
Python
#blog: xiaorui.cc
{
"size": 0,
"filter": {
"bool": {
"must": [
{
"terms": {
"keyword": [
"手机",
"iphone"
]
}
},
{
"range": {
"cdate": {
"gt": "2015-11-09T11:00:00"
}
}
}
]
}
}
} {
"took": 145,
"timed_out": false,
"_shards": {
"total": 30,
"successful": 30,
"failed": 0
},
"hits": {
"total": 6804,
"max_score": 0,
"hits": []
}
}<span style="font-size:13.2px;line-height:1.5;"></span>
#blog: xiaorui.cc
{
"size":0,
"filter":{
"bool":{
"must":[
{
"terms":{
"keyword":[
"手机",
"iphone"
]
}
},
{
"range":{
"cdate":{
"gt":"2015-11-09T11:00:00"
}
}
}
]
}
}
}
{
"took":145,
"timed_out":false,
"_shards":{
"total":30,
"successful":30,
"failed":0
},
"hits":{
"total":6804,
"max_score":0,
"hits":[]
}
}<spanstyle="font-size:13.2px;line-height:1.5;"></span>
如果你想同时使用query和filter查询的话,需要使用 {query:{filtered:{}}} 来包含这两个查询语法。他们的好处是,借助于filter的速度可以快速过滤出文档,然后再由query根据条件来匹配。
"query": {
"filtered": {
"query": { "match": { "email": "business opportunity" }},
"filter": { "term": { "folder": "inbox" }}
}
}
} { "size":0,
"query": {
"filtered": {
"query": {
"bool": {
"should": [],
"must_not": [ ],
"must": [
{
"term": { "channel_name":"微信自媒体微信"
}
} ]
}
} },
"filter":{
"range": {
"idate": {
"gte": "2015-09-01T00:00:00",
"lte": "2015-09-10T00:00:00" }
}
}
}
}
"query":{
"filtered":{
"query": {"match":{"email":"business opportunity"}},
"filter":{"term":{"folder":"inbox"}}
}
}
}
{ "size":0,
"query":{
"filtered":{
"query":{
"bool":{
"should":[],
"must_not":[
],
"must":[
{
"term":{
"channel_name":"微信自媒体微信"
}
}
]
}
}
},
"filter":{
"range":{
"idate":{
"gte":"2015-09-01T00:00:00",
"lte":"2015-09-10T00:00:00"
}
}
}
}
}
我们这业务上关于elasticsearch的查询语法基本都是用query filtered方式进行的,我也推荐大家直接用这样的方法。should ,must_not, must 都是列表,列表里面可以写多个条件。 这里再啰嗦一句,如果你的查询是范围和类型比较粗大的,用filter ! 如果是那种精准的,就用query来查询。
{
”bool”:{
”should”:[], #相当于OR条件
”must_not”:[], #必须匹配的条件,这里的条件都会被反义
”must”:[] #必须要有的
}
}
END..
【转】elasticsearch的查询器query与过滤器filter的区别的更多相关文章
- struts2的拦截器(Interceptor)与过滤器(Filter)
一.拦截器与过滤器的区别: 1.filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于Java本身的反射机制,这是两者最本质的区别. ...
- ElasticSearch中如何让query should等同于filter should
bool query must The clause (query) must appear in matching documents. should The clause (query) shou ...
- 拦截器(Inteceptor),过滤器(Filter),切面(Aspect)处理HttpServiceReqeust请求
1.拦截器 java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可 ...
- 拦截器Interceptor和过滤器Filter的区别
(1)过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西.定义这些要求的工具,就是过滤器.(理解:就是一堆字母中取一个B) (2)拦截器(Interceptor):在一个 ...
- ElasticSearch的 Query DSL 和 Filter DSL
Elasticsearch支持很多查询方式,其中一种就是DSL,它是把请求写在JSON里面,然后进行相关的查询. Query DSL 与 Filter DSL DSL查询语言中存在两种:查询DSL(q ...
- elasticsearch 高级查询
高级查询 子条件查询 (特定字段查询所指特定值) 复合条件查询 (以一定的逻辑组合子条件查询) 一.子条件查询 子条件查询分为 query context.filter context 1.query ...
- Swoole 实战:MySQL 查询器的实现(协程连接池版)
目录 需求分析 使用示例 模块设计 UML 类图 入口 事务 连接池 连接 查询器的组装 总结 需求分析 本篇我们将通过 Swoole 实现一个自带连接池的 MySQL 查询器: 支持通过链式调用构造 ...
- Elasticsearch查询——布尔查询Bool Query
Elasticsearch在2.x版本的时候把filter查询给摘掉了,因此在query dsl里面已经找不到filter query了.其实es并没有完全抛弃filter query,而是它的设计与 ...
- elasticsearch query 和 filter 的区别
Query查询器 与 Filter 过滤器 尽管我们之前已经涉及了查询DSL,然而实际上存在两种DSL:查询DSL(query DSL)和过滤DSL(filter DSL).过滤器(filter)通常 ...
随机推荐
- Jquery Mobile笔记之一
jQuery Mobile 在你的网页中添加 jQuery Mobile 你可以通过以下几种方式将jQuery Mobile添加到你的网页中: 从 CDN 中加载 jQuery Mobile (推荐) ...
- try...catch...finally语句块
try-catch-finally语句主要是用来处理检查异常,捕获并处理,以及最后必须要执行的finally块. try-catch-finally语句入门: 1.try-catch-finally语 ...
- Pyhton 学习笔记1
格式化 最后一个常见的问题是如何输出格式化的字符串.我们经常会输出类似'亲爱的xxx你好!你xx月的话费是xx,余额是xx'之类的字符串,而xxx的内容都是根据变量变化的,所以,需要一种简便的格式化字 ...
- C# 爬虫 抓取小说
心血来潮,想研究下爬虫,爬点小说. 通过百度选择了个小说网站,随便找了一本小书http://www.23us.so/files/article/html/13/13655/index.html. 1. ...
- 获取ip地址及城市信息
大家好,今天给大家分享的是一个简单的知识获取登录用户的ip地址及城市信息,lz是一个小白,如果有哪些错误的地方 欢迎大家指出 东西很简单,直接上代码 [HttpPost] public string ...
- 处理 Vue 单页面应用 SEO 的另一种思路
vue-meta-info 官方地址: monkeyWangs/vue-meta-info (设置vue 单页面meta info信息,如果需要单页面SEO,可以和 prerender-spa-plu ...
- ROS学习记录(一)————创建简单的机器人模型smartcar
这是我在古月居上找的(http://www.guyuehome.com/243),但直接运行的话,没办法跑起来,我也是查了好多博客和日志,才实现最后的功能的,所以,记录下来,以备后用吧,也欢迎其他和我 ...
- easyUI创建人员树
最近做了一个树状的下拉列表,在这里记录一下,以后可以直接使用 项目中的树状下拉列表是用来选择人员用的,具体实现展示如下: 先说一说功能,左边的人员数是提供选人的,当点击中间的按钮,选中的人员会直接移到 ...
- 【Alpha】第二次Daily Scrum Meeting
GIT 一.今日站立式会议照片 二.会议内容 1.统计,收集整理礼物的资料与详情 2.确定网页的实现方式 三.燃尽图
- 201521123071《java程序设计》第三周学习总结
1. 本周学习总结 这周主要学习了构造函数,类与对象,就是这周事情很多,还没来得及好好复习,所以有很多知识都没有认识透彻.但我会尽力补上的. http://images2015.cnblogs.com ...