elasticsearch query 和 filter 的区别

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

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:  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

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

42

#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根据条件来匹配。

Python

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

42

"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..

原文地址:

http://xiaorui.cc/2015/11/09/elasticsearch%e7%9a%84%e6%9f%a5%e8%af%a2%e5%99%a8query%e4%b8%8e%e8%bf%87%e6%bb%a4%e5%99%a8filter%e7%9a%84%e5%8c%ba%e5%88%ab/

转载时必须以链接形式注明原始出处及本声明。

时间: 2024-10-11 18:19:40

elasticsearch query 和 filter 的区别的相关文章

Elasticsearch的DSL之query and filter

在Elasticsearch的DSL中, 有两个概念需要搞清楚, query 和 filter, 对ES的检索效率是很有影响的. 下面就来搞清楚这两个关键字的具体函数. query context: 回答的是这个文档在多大程度上匹配查询语句(How well does this document match this query clause?),会计算出一个分数_score. filter context: 回答的是这个文档与查询语句是否匹配,是 或者 不是(Does this documen

Query DSL for elasticsearch Query

Query DSL Query DSL (资料来自: http://www.elasticsearch.cn/guide/reference/query-dsl/) http://elasticsearch.qiniudn.com/ --简介-- elasticsearch 提供基于JSON的完整的Query DSL查询表达式(DSL即领域专用语言). 一般来说, 普通的查询如 term 或者 prefix. 另外还有混合查询如 bool 等. 另外查询表达式(Queries)还能够关联特定的过

ES的Query、Filter、metric、bucketing使用详解

由于笔者在实际项目仅仅将ES用作索引数据库,并没有深入研究过ES的搜索功能.而且鉴于笔者的搜索引擎知识有限,本文将仅仅介绍ES简单(非全文)的查询API. 笔者原本打算在本文中介绍聚合API的内容,但是写着写着发现文章有点过长,不便于阅读,故将聚合API的内容移至下一篇博客中. 引言 单单介绍理论和API是乏味和低效率的,本文将结合一个实际的例子来介绍这些API.下表是本文数据表的表结构,表名(type)为“student”.注意,studentNo是本表的id,也就是_id字段的值与stude

Elasticsearch Query DSL备忘(1)(Constant score query和Bool Query)

Query DSL (Domain Specific Language),基于json的查询方式 1.Constant score query,常量分值查询,目的就是返回指定的score,一般都结合filter使用,因为filter context忽略score. GET /customer/_search { "query": { "constant_score": { "filter": { "match": { &quo

django orm中 get 与filter的区别

django orm中 get 与filter的区别: 以前误以为get与filter的区别仅仅是filter返回多条,而get仅支持一条记录,直到使用related_name属性 才发现,两者的差异远不止如此,最本质的区别是 filter返回的值是一个queryset对象, 而get 返回值是一个定义的model对象, 使用get 返回的结果去访问子表对象可以成功,而使用filter就会出错, 是因为queryset 对象没有realtaed_name属性,无法回溯到子表

jquery find()和filter()的区别

在写js查找当前标签下某一子元素的子元素集合时,用到了此方法 1 $(".flyout-trigger").mouseover(function(){ 2 var maxnum=$(this).find(".flyout-link").children().filter("dt").size(); 3 $(this).children(".flyout-link").show(); 4 $(this).children(&qu

vue-router的query和params的区别

vue-router的query和params的区别 首先简单来说明一下$router和$route的区别 $router为VueRouter实例,想要导航到不同url,则使用$router.push方法 $route为当前router跳转对象,里面可以获取name.path.query.params等 params方式传参和接收参数 this.$router.push({ name:'xxx' params:{ id:id } }) 接收参数: this.$route.params.id qu

ES 23 - 检索和过滤的区别 (query vs. filter)

目录 1 filter与query示例 1.1 准备测试数据 1.2 搜索测试 2 filter与query的区别 2.1 相关度处理上的不同 2.2 性能上的对比 2.3 对比结论 本文以 ES 6.6.5 版本为例进行演示. 1 filter与query示例 1.1 准备测试数据 PUT website/_doc/1 { "title": "小白学ES01", "desc": "the first blog about es&quo

Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query

目录 引言 Match Phase Query slop 参数 analyzer 参数 zero terms query Match Phrase 前缀查询 max_expansions 小结 参考文档 系列文章列表 Query DSL Java Rest Client API 引言 今天再读庄子的<逍遥游>,其中鲲鹏之扶摇直上九万里之气势,蜩(tiao)与学鸠之渺小之对比,令人印象深刻,并对鲲鹏之志心生向往.而郭象在注<庄子>卷中却说,"苟足于其性,则虽大鹏无以自贵于小