【转】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)通常 ...
随机推荐
- Eclipse常用快捷键和调试方法
原文链接:http://my.oschina.net/u/1054538/blog/741561 常用快捷键 Eclipse最全快捷键,熟悉快捷键可以帮助开发事半功倍,节省更多的时间来用于做有意义的事 ...
- Java基础语法(三)---数组
一.概念 同一种类型数据的集合.简单的来说就是一容器,用来装东西的. 使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素. 二.一维数组的格式 格式1:元素类型 [ ...
- Python验证码通过pytesser识别
Python安装包: 需要安装的包主要有两个: PIL 和 pytesser .tesseract (1).安装PIL:下载地址:http://www.pythonware.com/products/ ...
- CSS3学习笔记-1:CSS样式继承
自己在写css时总会遇上css样式继承的问题,好在一般问题不大,但一直也不明白css样式继承的规则,最近发现了一篇文章讲的不错,因此转载过来: 所谓CSS的继承是指被包在内部的标签将拥有外部标签的样式 ...
- MariaDB体验2----CSV文件导入
之前已经安装好MariaDB,现在需要将一份从Sql Server数据库里面导出的CSV文件导入进MariaDB,期间碰到了各种坑,这里记录一下. HeidiSQL的导入CSV文件的地方在“工具”栏, ...
- CSS中的路径裁剪样式clip-path
前面的话 CSS借鉴了SVG裁剪的概念,设置了clip-path样式,本文将详细介绍路径裁剪clip-path 概述 clip-path属性可以防止部分元素通过定义的剪切区域来显示,仅通过显示的特殊区 ...
- Java基础学习——泛型
一.泛型方法 /** 自定义泛型:自定义泛型可以理解为是一个数据类型的占位符,或者理解为是一个数据类型的变量. 泛型方法: 泛型方法的自定义格式:修饰符<声明自定义泛型>返回值类型 函数名 ...
- Java Object中的equals和hashCode
Java的Object对象中有两个方法比较有意思,一个是equals(),一个是hashCode(),那么这两个的作用有些同学可能还不是很清楚,那么同学们现在就进一步了解一下吧. 下面咱们写一个简单的 ...
- Membership ——入门基础
Membership是ASP.NET为我们提供的一套验证和存储用户凭证的框架.它可以帮助我们快速的开发用户登录.管理以及权限验证相关的模块,很多人可能会说Membership开发起来确实很快,但是总是 ...
- Vue项目搭建基础之Vue-cli模版测试
第一步安装node,nodejs.org下载node稳定版安装包.node -v (查看node版本)npm install -g vue-cli(安装Vue脚手架环境)vuevue listvu ...