elasticsearch布尔查询

作者: 鲁智深 分类: java 发布时间: 2018-05-13 03:20

开始我们组合查询中布尔查询的学习!

bool查询包括must,should,must_not,filter来完成

bool的写法

1
2
3
4
5
6
bool{
"filter":[],#过滤,不支持权重打分
"must":[],#数组中的查询必须满足
"shoul":[],#数组中的查询满足一个或者多个
"must_not":[]#数组中一个都不能满足
}

通过过滤查找salary_min字段等于1800数据,需要查询某些精确的值建议用term完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET jobbole/job/_search
{
  "query": {
    "bool": {
      "must": {
          "match_all": {}
        },
      "filter":{
        "term":{
          "salary_min":1800
        }
      }
    }
  }
}

查询多个并且过滤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET jobbole/job/_search
{
  "query": {
    "bool": {
      "must": {
          "match_all": {}
        },
      "filter":{
        "terms":{
          "salary_min":["1800",1700]
        }
      }
    }
  }
}

这里如果terms查询过滤条件test字段类型的数据,必须小写,因为text文档会被elasticsearch入库的时候全部改成小写,match就不会存在这样问题。

查看分析器解析的内容

1
2
3
4
5
6
7
8
9
10
11
GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "pyton网络开发工程师"
}

GET _analyze
{
  "analyzer": "ik_smart",
  "text": "pyton网络开发工程师"
}

结果显示ik_max_word比ik_smart分词更加细致,具体看文档github

查询工资大于1700或者工作python web开发,排除工作1800

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
GET jobbole/job/_search
{
  "query": {
    "bool": {
      "should": [
        {"term": {
          "salary_min": {
            "value": "1700"
          }
        }},
        {"term": {
            "title": {
              "value": "python web开发"
            }
          }
        }
        ],
      "must_not":{
        "term":{
          "salary_min":1800
        }
      }
    }
  }
}

嵌套查询,bool里面嵌套bool,查询title为游戏 or(title为python and salary_min为1500)的数据

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
GET jobbole/job/_search
{
  "query": {
    "bool": {
      "should": [
        {"term": {
          "title": {
            "value": "游戏"
          }
        }},
        {"bool": {
          "must": [
            {"term": {
              "title": {
                "value": "python"
              }
            }},
            {"term": {
              "salary_min": {
                "value": "1500"
              }
            }}
          ]
        }}
      ]
    }
  }
}

查询非null的数据,如果数据存在null,我们需要过滤掉这些数据,语法如下:

1
2
3
4
5
6
7
8
9
10
11
12
GET jobbole/job/_search
{
  "query": {
    "bool": {
      "filter": {
        "exists": {
          "field": "title"
        }
      }
    }
  }
}

查询null的数据,反过来,我们需要查询某个字段为null的数据,就是用must_not

1
2
3
4
5
6
7
8
9
10
11
12
GET jobbole/job/_search
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "title"
        }
      }
    }
  }
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注