ElasticSearch的 Query DSL 和 Filter DSL
Elasticsearch支持很多查询方式,其中一种就是DSL,它是把请求写在JSON里面,然后进行相关的查询。
Query DSL 与 Filter DSL
DSL查询语言中存在两种:查询DSL(query DSL)和过滤DSL(filter DSL)。
它们两个的区别如下图:

query DSL
在查询上下文中,查询会回答这个问题——“这个文档匹不匹配这个查询,它的相关度高么?”
如何验证匹配很好理解,如何计算相关度呢?ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。另外关于某个搜索的分值计算还是很复杂的,因此也需要一定的时间。
查询上下文 是在 使用query进行查询时的执行环境,比如使用search的时候。
一些query的场景:
- 与full text search的匹配度最高
- 包含run单词,如果包含这些单词:runs、running、jog、sprint,也被视为包含run单词
- 包含quick、brown、fox。这些词越接近,这份文档的相关性就越高
filter DSL
在过滤器上下文中,查询会回答这个问题——“这个文档匹不匹配?”
答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。
过滤上下文 是在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter
另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。
一些过滤的情况:
- 创建日期是否在2013-2014年间?
- status字段是否为published?
- lat_lon字段是否在某个坐标的10公里范围内?
参考: http://www.cnblogs.com/xing901022/p/4975931.html
下图的查询就是一个组合查询, 既有 filter 也有 query:

上面文章提供了一个测试例子。
- query语句查询结果,第一次查询用了300ms,第二次用了280ms.
- filter查询出来的结果,第一次查询时间是280ms,第二次130ms。
具体如何写 查询和 过滤并存的请看下面这篇文章:
查询与过滤条件的合并   
http://es.xiaoleilu.com/054_Query_DSL/75_Queries_with_filters.html
比如说我们有这样一条查询语句,获取右键内容中带“business opportunity”  的:
{   
    "match": {    
        "email": "business opportunity"    
    }    
}
然后我们想要让这条语句加入 term 过滤,只在收信箱中匹配邮件:
{   
    "term": {    
        "folder": "inbox"    
    }    
}
search API中只能包含 query 语句,所以我们需要用 filtered 来同时包含 "query" 和 "filter" 子句:
{   
    "filtered": {    
        "query":  { "match": { "email": "business opportunity" }},    
        "filter": { "term":  { "folder": "inbox" }}    
    }    
}
我们在外层再加入 query 的上下文关系:
GET /_search   
{    
    "query": {    
        "filtered": {    
            "query":  { "match": { "email": "business opportunity" }},    
            "filter": { "term": { "folder": "inbox" }}    
        }    
    }    
}
更多参考: http://es.xiaoleilu.com/054_Query_DSL/75_Queries_with_filters.html
参考:
http://www.fanli7.net/a/bianchengyuyan/C__/20150526/501179.html
ElasticSearch的 Query DSL 和 Filter DSL的更多相关文章
- Elasticsearch(5) --- Query查询和Filter查询
		Elasticsearch(5) --- Query查询和Filter查询 这篇博客主要分为 :Query查询和Filter查询.有关复合查询.聚合查询也会单独写篇博客. 一.概念 1.概念 一个查询 ... 
- 【转】elasticsearch的查询器query与过滤器filter的区别
		很多刚学elasticsearch的人对于查询方面很是苦恼,说实话es的查询语法真心不简单- 当然你如果入门之后,会发现elasticsearch的rest api设计是多么有意思. 说正题,ela ... 
- Elasticsearch 之 query与filter区别
		转载: http://xiaorui.cc/category/elasticsearch/ http://blog.csdn.net/asia_kobe/article/details/5056301 ... 
- DSL是什么?Elasticsearch的Query DSL又是什么?
		1.DSL简介 DSL 其实是 Domain Specific Language 的缩写,中文翻译为领域特定语言.而与 DSL 相对的就是 GPL,这里的 GPL 并不是我们知道的开源许可证(备注:G ... 
- Elasticsearch Span Query跨度查询
		ES基于Lucene开发,因此也继承了Lucene的一些多样化的查询,比如本篇说的Span Query跨度查询,就是基于Lucene中的SpanTermQuery以及其他的Query封装出的DSL,接 ... 
- Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结
		Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结 1. 管道抽象 1 2. 层次结构抽象(json,xml etc) 1 3. 异步抽象promise 1 4. Ide ... 
- elasticsearch Terms Query 实现类似于sql in查询
		本文demo基于elasticsearch 5.1.1, 项目中使用的还是较早的版本 例如 import com.alibaba.fastjson.JSON; import org.elastics ... 
- Elasticsearch由浅入深(九)搜索引擎:query DSL、filter与query、query搜索实战
		search api的基本语法 语法概要: GET /_search {} GET /index1,index2/type1,type2/_search {} GET /_search { , } h ... 
- python查询elasticsearch(Query DSL) 实例
		import datetime import sys import getopt import hashlib from elasticsearch import Elasticsearch &quo ... 
随机推荐
- SqlServer中日期和时间数据类型及函数 【转】
			来源:http://blog.csdn.net/royalwzy/article/details/6446075 日期和时间数据类型 下表列出了 Transact-SQL 的日期和时间数据类型. 数据 ... 
- openJudge计算概论-谁考了第k名
			/*===================================== 谁考了第k名 总时间限制: 1000ms 内存限制: 65536kB 描述 在一次考试中,每个学生的成绩都不相同,现知道 ... 
- selenium+python自动化之环境安装
			一.Python安装 1.操作系统:win7 64位系统 2.下载Python安装包,选择2.7版本和3.6版本都可以(最好安装2.7版本稳定)官网下载地址:https://www.python.or ... 
- spring基础部分——注解
			注解: @Entity @Table @Column @Enumerated @Autowired @Controller @RequestMapping @RequestParam 
- [java] JNLP文件安装
			JNLP(Java Network Launching Protocol )是java提供的一种可以通过浏览器直接执行java应用程序的途径,它使你可以直接通过一个网页上的url连接打开一个java应 ... 
- 每日学习心得:SQL查询表的行列转换/小计/统计(with  rollup,with cube,pivot解析)
			2013-8-20 1. SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析) 在实际的项目开发中有很多项目都会有报表模块,今天就通过一个小的SQL ... 
- Jar mismatch! Fix your dependencies的问题
			在开发Android项目的时候,有时需要引用多个项目作为library.在引用项目的时候,有时会出现“Jar mismatch! Fix your dependencies”错误. 这是因为两个项目的 ... 
- 【Andorid开发框架学习】之Mina开发之服务器开发
			下午那篇博客我们讲到了Mina的客户端的开发,如果还有没看过的同学可以看一下,我是传送门.现在,我们来学习一下,Mina的服务器的开发. 一.首先看一下,我的服务器的代码图片: 服务器代码我是在My ... 
- HackerRank "Morgan and a String"
			I saw the same sub-problem in LeetCode, and there exists a O(n) neat greedy solution: for _ in range ... 
- iframe获取父、子窗口的方法
			jquery.js调用iframe父窗口与子窗口元素的方法 1. jquery在iframe子页面获取父页面元素代码如下: $("#objid",parent.document) ... 
