很多刚学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的区别的更多相关文章

  1. struts2的拦截器(Interceptor)与过滤器(Filter)

    一.拦截器与过滤器的区别: 1.filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于Java本身的反射机制,这是两者最本质的区别. ...

  2. ElasticSearch中如何让query should等同于filter should

    bool query must The clause (query) must appear in matching documents. should The clause (query) shou ...

  3. 拦截器(Inteceptor),过滤器(Filter),切面(Aspect)处理HttpServiceReqeust请求

    1.拦截器 java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可 ...

  4. 拦截器Interceptor和过滤器Filter的区别

    (1)过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西.定义这些要求的工具,就是过滤器.(理解:就是一堆字母中取一个B) (2)拦截器(Interceptor):在一个 ...

  5. ElasticSearch的 Query DSL 和 Filter DSL

    Elasticsearch支持很多查询方式,其中一种就是DSL,它是把请求写在JSON里面,然后进行相关的查询. Query DSL 与 Filter DSL DSL查询语言中存在两种:查询DSL(q ...

  6. elasticsearch 高级查询

    高级查询 子条件查询 (特定字段查询所指特定值) 复合条件查询 (以一定的逻辑组合子条件查询) 一.子条件查询 子条件查询分为 query context.filter context 1.query ...

  7. Swoole 实战:MySQL 查询器的实现(协程连接池版)

    目录 需求分析 使用示例 模块设计 UML 类图 入口 事务 连接池 连接 查询器的组装 总结 需求分析 本篇我们将通过 Swoole 实现一个自带连接池的 MySQL 查询器: 支持通过链式调用构造 ...

  8. Elasticsearch查询——布尔查询Bool Query

    Elasticsearch在2.x版本的时候把filter查询给摘掉了,因此在query dsl里面已经找不到filter query了.其实es并没有完全抛弃filter query,而是它的设计与 ...

  9. elasticsearch query 和 filter 的区别

    Query查询器 与 Filter 过滤器 尽管我们之前已经涉及了查询DSL,然而实际上存在两种DSL:查询DSL(query DSL)和过滤DSL(filter DSL).过滤器(filter)通常 ...

随机推荐

  1. MySQL整数类型说明 int(5) vs int(7)

    今天突然发现, mysql 中int(1)和tinyint(1)中的1只是指定显示长度,并不表示存储长度,只有字段指定zerofill时有用.位数限制基本没有意义. int(5) 这里的5表示的是 最 ...

  2. Git学习总结(一)

    .常用Git命令清单 一.新建代码库 #在当前目录创建一个Git代码库 $ git init #新建一个目录,将其初始化为Git代码库 $ git init [project name] #下载一个项 ...

  3. OpenID Connect:OAuth 2.0协议之上的简单身份层

    OpenID Connect是什么?OpenID Connect(目前版本是1.0)是OAuth 2.0协议(可参考本人此篇:OAuth 2.0 / RCF6749 协议解读)之上的简单身份层,用 A ...

  4. nginx 安装和配置

    1. 安装相关依赖 yum install readline-devel pcre-devel openssl-devel zlib-devel gcc gcc-c++ gd-devel libxml ...

  5. mysql数据类型double和decimal区别详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt336 实数是带有小数部分的数字.然而,它们不只是为了存储小数部分,也可以使用 ...

  6. javaScript数组去重方法

    在JAvascript平时项目开发中经常会用到数组去重的操作.这时候就要用到JS数组去重的方法了. demo1: 第一种:JS数组去重操作方法是利用遍历原数组,利用数组的indexOf()方法来来判断 ...

  7. 利用百度地图API和群蚁算法,对TSP问题进行模拟与求解

    前言 最近由于换了工作,期间也有反思和总结上家公司的得失,总觉得有什么事情当初可以完成或者完成得更好,其中TSP问题就是其中之一.当初在开发一个仓配系统的时候,有一个线路排程的需求,当时自己简单在纸上 ...

  8. JavaScript封装一个MyAlert弹出框

    平时我们想要显示一些提示信息时会用到alert方法,alert是全局的一个方法,会短暂的中断程序,我们主要用来显示提示客户信息.但是这个方法有一定的局限性,而且本身样式也不够美观.于是我封装了一个实用 ...

  9. 【Java并发编程】之六:Runnable和Thread实现多线程的区别(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17161237 Java中实现多线程有两种方法:继承Thread类.实现Runnable接口 ...

  10. 【Alpha】第二次Daily Scrum Meeting

    GIT 一.今日站立式会议照片 二.会议内容 1.统计,收集整理礼物的资料与详情 2.确定网页的实现方式 三.燃尽图