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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#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要多一点,换句话说,更加的精准。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#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> |
如果你想同时使用query和filter查询的话,需要使用 {query:{filtered:{}}} 来包含这两个查询语法。他们的好处是,借助于filter的速度可以快速过滤出文档,然后再由query根据条件来匹配。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
"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”:[] #必须要有的
}
}
elasticsearch的查询器query与过滤器filter的区别相关推荐
- 总结 拦截器(Interceptor) 和 过滤器(Filter)的区别
一.前言 拦截器(Interceptor) 和 过滤器(Filter)的区别是面试中常问的问题,也是开发中容易被大家混淆的问题,在此总结下,希望对大家有所帮助. 二.Filter 介绍 2.1.概念 ...
- Springmvc中的拦截器interceptor及与过滤器filter的区别
一.Springmvc中的拦截器概述及与过滤器filter的区别 1).Springmvc中的拦截器interceptor用于对控制器controller进行预处理和后处理的技术; 2).可以定义拦截 ...
- ElasticSearch各种查询对象Query的使用
ElasticSearch各种查询对象Query的使用 ElasticSearch提供QueryBuilders.queryStringQuery(要搜索的内容)查询方法,对所有字段进行分词查询. 分 ...
- SpringMVC→拦截器、SpringMVC拦截器实现、多个拦截器工作原理、拦截器使用场景、拦截器Interceptor与过滤器Filter区别
拦截器 拦截器实现 多个拦截器工作原理 拦截器使用场景 请求编码设置及请求登录Session校验 使用时间段设置 拦截器Interceptor与过滤器Filter区别
- 拦截器(Inteceptor),过滤器(Filter),切面(Aspect)处理HttpServiceReqeust请求
1.拦截器 java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可 ...
- ElasticSearch 高级查询语法
ElasticSearch 高级查询语法Query DSL ES倒排索引 ES高级查询Query DSL 查询所有 match_all 分页查询form 深分页查询Scroll 指定字段排序sort ...
- ES中的Query与Filter的区别
QElasticsearch支持很多查询方式,其中一种就是DSL,它是把请求写在JSON里面,然后进行相关的查询. Query DSL 与 Filter DSL DSL查询语言中存在两种:查询DSL( ...
- mysql 连接查询_Swoole 实战:MySQL 查询器的实现(协程连接池)
Swoole 实战:MySQL 查询器的实现(协程连接池) 需求分析 本篇我们将通过 Swoole 实现一个自带连接池的 MySQL 查询器: 1. 支持通过链式调用构造并执行 SQL 语句: 2. ...
- Elasticsearch:分词器中的 token 过滤器使用示例
分词器在 Elasticsearch 的使用中非常重要.分词器中的过滤器可以帮我们对最终的分词进行处理,从而使得我们得到的最终分词会影响存储的大小和搜索的方式.在今天的文章中,我来分享一下一些常用的分 ...
最新文章
- Swift - 简单的原生与网页交互
- html的进一步了解(更新中···)
- 计算机网络与影视多媒体技术 南京理工大学,计算机网络多媒体数学库和课件结构设计-计算机仿真论文-计算机论文(8页)-原创力文档...
- Walking Robot
- ASP.NET Core如何限制请求频率
- android 画面,Android 界面组成
- 利用计算机的说课稿,《计算机的发展与应用》说课稿
- [转载] 快速入门(完整):Python实例100个(基于最新Python3.7版本)
- mysql创建数据库的语法_mysql创建数据库语法
- php微信个人号api,ItChat
- Linux软件安装方法之rpm包安装
- 网站优化关键词选择时需要的注意事项
- 雷课堂(THUnderClass)——清华大学2020C++大作业个人项目记录与总结
- Pre-commit:如何使用 husky、lint-staged和prettier优化你的项目
- 51单片机按下按键数码管加一
- wegame服务器选择不显示,wegame辅助功能不显示怎么解决
- 1.11——Go语言适合做什么
- 关于国密HTTPS的那些事(三)
- Android 6.0指纹识别App开发demo
- ROUGE和pyrouge的安装