ES之DSL查询

一、ES介绍

  ES因搜索而生,主要工作就是处理查询,返回结果

二、查询语句

 1 {
 2     "size": 0,
 3     "query": {
 4         "bool": {
 5             "must": [{
 6                 "match": {
 7                     "dip": "192.168.1.1"
 8                 }
 9             }],
10             "filter": [{
11                 "range": {
12                     "occur_time": {
13                         "gte": 1553443200000,
14                         "lte": 1553529599000
15                     }
16                 }
17             }]
18         }
19     },
20     "aggs": {
21         "count": {
22             "sum": {
23                 "field": "count"
24             }
25         }
26     }
27 }

三、说明

1.match_all 匹配所有查询,是没有查询条件下的默认语句

1 {
2     "query": {
3         "match_all": {}
4     }
5 }

  此查询常用于合并过滤条件。比如说你需要检索所有的邮箱,所有的文档相关性都是相同的,所以得到的_score为1。

2.match 匹配分词

1 {
2     "query": {
3         "match": {
4             "ip_category": 1
5         }
6     }
7 }

  match查询只能就指定某个确切字段某个确切的值进行搜索,因此一定要指定正确的字段名以避免语法错误。

3.multi_match 多值匹配

 1 {
 2     "query": {
 3         "multi_match": {
 4             "query": "1",
 5             "fields": [
 6                 "title",
 7                 "content"
 8             ]
 9         }
10     }
11 }

  查询文章标题和内容包含1的数据

4.term 精确匹配,不分词,精确匹配数字、日期、布尔值等未经切词的文本数据类型

1 {
2     "query": {
3         "term": {
4             "ip": "192.168.1.1"
5         }
6     }
7 }

5.terms 多值匹配,如果某个字段指定了多个值,那么文档需要一起去做匹配

 1 {
 2     "query": {
 3         "terms": {
 4             "title": [
 5                 "java",
 6                 "python"
 7             ]
 8         }
 9     }
10 }

6.range 范围查询,gt-大于,gte-大于等于,It-小于,Ite-小于等于

 1 {
 2     "query": {
 3         "range": {
 4             "age": {
 5                 "gte": 1,
 6                 "Ite": 6
 7             }
 8         }
 9     }
10 }

 7.exists和missing 查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的is_null/not is_null

1 {
2     "exists": {
3         "field": "title"
4     }
5 }

  这两个过滤只是针对已经查出来一批数据来,但是想区分出某个字段是否存在的时候使用

8.bool 过滤,合并多个过滤条件查询结果的布尔逻辑,它包含的操作符:

  • must:多个查询条件的完全匹配,相当于and
  • must_not:多个查询条件的相反匹配,相当于not
  • should:至少有一个查询条件匹配,相当于or

  这些参数可以分别继承一个过滤条件或者一个过滤条件的数组

 1 {
 2     "bool": {
 3         "must": {"term": {"folder": "inbox"}},
 4         "must_not": {"term": {"tag": "spam"}},
 5         "should": [
 6                  {"term": {"starred": true}},
 7                  {"term": {"unread": true}}
 8         ]
 9     }
10 }
  • filter:返回的文档必须满足filter子句的条件,但是不会像must一样,参与计算分值

    在filter子句查询中,分值将会都返回0,分值会受特定的查询影响。

    比如,下面三个查询中都是返回所有status字段为active的文档

  第一个查询,所有的文档都会返回0:

 1 {
 2     "query": {
 3         "bool": {
 4             "filter": {
 5                 "term": {
 6                     "status": "active"
 7                 }
 8             }
 9         }
10     }
11 }

  第二个查询,bool查询中包含了一个match_all,因此所有得文档都会返回1

 1 {
 2     "query": {
 3         "bool": {
 4             "must": {
 5                 "match_all": {}
 6             },
 7             "filter": {
 8                 "term": {
 9                     "status": "active"
10                 }
11             }
12         }
13     }
14 }

  第三个查询,constant_score与上面的查询结果相同,也会给每个文档返回1:

 1 {
 2     "query": {
 3         "constant_score": {
 4             "filter": {
 5                 "term": {
 6                     "status": "active"
 7                 }
 8             }
 9         }
10     }
11 }

 

posted @ 2019-05-15 17:32  mia0812  阅读(3175)  评论(0编辑  收藏  举报