很多刚学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的区别相关推荐

  1. 总结 拦截器(Interceptor) 和 过滤器(Filter)的区别

    一.前言 拦截器(Interceptor) 和 过滤器(Filter)的区别是面试中常问的问题,也是开发中容易被大家混淆的问题,在此总结下,希望对大家有所帮助. 二.Filter 介绍 2.1.概念 ...

  2. Springmvc中的拦截器interceptor及与过滤器filter的区别

    一.Springmvc中的拦截器概述及与过滤器filter的区别 1).Springmvc中的拦截器interceptor用于对控制器controller进行预处理和后处理的技术; 2).可以定义拦截 ...

  3. ElasticSearch各种查询对象Query的使用

    ElasticSearch各种查询对象Query的使用 ElasticSearch提供QueryBuilders.queryStringQuery(要搜索的内容)查询方法,对所有字段进行分词查询. 分 ...

  4. SpringMVC→拦截器、SpringMVC拦截器实现、多个拦截器工作原理、拦截器使用场景、拦截器Interceptor与过滤器Filter区别

    拦截器 拦截器实现 多个拦截器工作原理 拦截器使用场景 请求编码设置及请求登录Session校验 使用时间段设置 拦截器Interceptor与过滤器Filter区别

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

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

  6. ElasticSearch 高级查询语法

    ElasticSearch 高级查询语法Query DSL ES倒排索引 ES高级查询Query DSL 查询所有 match_all 分页查询form 深分页查询Scroll 指定字段排序sort ...

  7. ES中的Query与Filter的区别

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

  8. mysql 连接查询_Swoole 实战:MySQL 查询器的实现(协程连接池)

    Swoole 实战:MySQL 查询器的实现(协程连接池) 需求分析 本篇我们将通过 Swoole 实现一个自带连接池的 MySQL 查询器: 1. 支持通过链式调用构造并执行 SQL 语句: 2. ...

  9. Elasticsearch:分词器中的 token 过滤器使用示例

    分词器在 Elasticsearch 的使用中非常重要.分词器中的过滤器可以帮我们对最终的分词进行处理,从而使得我们得到的最终分词会影响存储的大小和搜索的方式.在今天的文章中,我来分享一下一些常用的分 ...

最新文章

  1. Swift - 简单的原生与网页交互
  2. html的进一步了解(更新中···)
  3. 计算机网络与影视多媒体技术 南京理工大学,计算机网络多媒体数学库和课件结构设计-计算机仿真论文-计算机论文(8页)-原创力文档...
  4. Walking Robot
  5. ASP.NET Core如何限制请求频率
  6. android 画面,Android 界面组成
  7. 利用计算机的说课稿,《计算机的发展与应用》说课稿
  8. [转载] 快速入门(完整):Python实例100个(基于最新Python3.7版本)
  9. mysql创建数据库的语法_mysql创建数据库语法
  10. php微信个人号api,ItChat
  11. Linux软件安装方法之rpm包安装
  12. 网站优化关键词选择时需要的注意事项
  13. 雷课堂(THUnderClass)——清华大学2020C++大作业个人项目记录与总结
  14. Pre-commit:如何使用 husky、lint-staged和prettier优化你的项目
  15. 51单片机按下按键数码管加一
  16. wegame服务器选择不显示,wegame辅助功能不显示怎么解决
  17. 1.11——Go语言适合做什么
  18. 关于国密HTTPS的那些事(三)
  19. Android 6.0指纹识别App开发demo
  20. ROUGE和pyrouge的安装

热门文章

  1. 【GANs学习笔记】(十九)CycleGAN、StarGAN
  2. Hair-Gan论文翻译
  3. win10 无法拨号上网720错误
  4. Matlab读取图像,显示H、S、V分量
  5. IDEA连接mysql后,schemas中无表格
  6. 神经网络建模的适用范围,神经网络建模步骤视频
  7. AlphaZero登上Science封面:从小白开始制霸多个游戏
  8. 猜大小游戏(条件判断)
  9. 小菜鸟的C++游戏编程学习日记(一)
  10. Verilog HDL 总结(1)