ES SearchAPI----Query DSL语言

Query DSL:Elasticsearch 提供了一个可以执行查询的JSON 风格的 DSL (domain-specific language 领域特定语言)。这个被称为 Query DSL

ES 支持两种基本方式检索,通俗的讲第二种检索方式的请求体就是DSL语言

  • 一个是通过使用 REST request URI 发送检索参数(ur+检索参数)
  • 另一个是通过使用 REST request body 来发送它们(uri+请求体)

接下来的实验操作都是基于测试数据(account.json)进行的。

Getting Started

match_all查询全部

GET /bank/_search
{
    
    
  "query":{
    
    
    "match_all": {
    
    }
  }
}

sort排序

query:指定查询的条件
sort:进行排序

GET /bank/_search
{
    
    
  "query": {
    
    
    "match_all": {
    
    }
  },
  "sort": [
    {
    
    
      "FIELD": {
    
    
        "order": "desc"
      }
    }
  ]
}

在这里插入图片描述

from\size分页

默认每次查询10条数据,可以使用fromsize指定每页的记录数,下面的DSL表示每页查询5条数据,这是第一页
from=(pageNum-1) * pageSize

GET /bank/_search
{
    
    
  "query": {
    
    
    "match_all": {
    
    }
  },
  "sort": [
    {
    
    
      "balance": {
    
    
        "order": "asc"
      }
    }
  ],
  "from": 0,
  "size": 5
}

_source指定字段

"_source"可以指定结果集中只显示哪些字段

GET /bank/_search
{
    
    
  "query": {
    
    
    "match_all": {
    
    }
  },
  "sort": [
    {
    
    
      "balance": {
    
    
        "order": "asc"
      }
    }
  ],
  "_source": ["firstname","lastname","gender"], 
  "from": 5,
  "size": 5
}

在这里插入图片描述

match匹配查询

基本语法如下所示:

GET /bank/_search
{
    
    
  "query": {
    
    
    "match": {
    
    
      "FIELD": "TEXT"
    }
  }
}
  1. 如果match匹配非字符串字段,那么就是精确查询
  2. 如果match匹配字符串字段,那么就是模糊查询,也叫全文检索
# 匹配非字符串字段,就是精确查询
GET /bank/_search
{
    
    
  "query": {
    
    
    "match": {
    
    
      "account_number": 20
    }
  }
}
# 匹配字符串字段,就是模糊查询
# 查询出19条数据,它是分词查询,这些记录按照各自的评分进行排序
GET /bank/_search
{
    
    
  "query": {
    
    
    "match": {
    
    
      "address": "mill lane"
    }
  }
}

match_phrase短语匹配

前面使用match匹配查询"address": "mill lane"它是进行的分词查询,如下图
在这里插入图片描述
但有时候就需要将mill lane作为一个整体(短语)进行匹配,这个时候就可以使用match_phrase进行匹配,它会将mill lane作为整体,只要Value中包含mill lane就会被匹配成功

GET /bank/_search
{
    
    
  "query": {
    
    
    "match_phrase": {
    
    
      "address": "mill lane"
    }
  }
}

在这里插入图片描述

multi_match多字段匹配

比如期望查询出address或state这两个字段中都包含mill,就好比SQL的如下语句

select * from table_name where address like `%mill%` or state like `%mill%`

基本语法格式如下所示;其中query用来指定匹配的值,fields用来指定将从哪些字段中去匹配该值

GET /bank/_search
{
    
    
  "query": {
    
    
    "multi_match": {
    
    
      "query": "",
      "fields": []
    }
  }
}

在这里插入图片描述
多字段匹配的时候会不会进行分词查询呢?
在这里插入图片描述

range范围查询

基本格式

GET bank/_search
{
    
    
  "query": {
    
    "range": {
    
    
    "FIELD": {
    
    
      "gte": 10,
      "lte": 20
    }
  }}
}

bool复合查询

bool用来做复合查询;复合语句可以合并任何其他查询语句,包括复合语句,了解这一点很重要的,这就意味着,复合语句之间可以相互嵌套,可以表达非常复杂的逻辑

must必须匹配,可贡献得分

must:必须达到must列举的所有条件,并将有助于得分

期望查询出gender=’M‘并且address中包含’mill‘的记录

# select * from table_name where gender='M' and address like '%mill%'
GET bank/_search
{
    
    
  "query": {
    
    
    "bool": {
    
    
      "must": [
        {
    
    "match": {
    
    "gender": "M"}},
        {
    
    "match": {
    
    "address": "mill"}}
      ]
    }
  },
  "_source": ["gender","address"]
}

在这里插入图片描述

must_not必须不匹配,可贡献得分

记录一下格式,注意层级格式

# gender=M’ and address like '%mill%' and age <> 28
GET bank/_search
{
    
    
  "query": {
    
    
    "bool": {
    
    
      "must": [
        {
    
    "match": {
    
    "gender": "M"}},
        {
    
    "match": {
    
    "address": "mill"}}
      ],
      "must_not": [
        {
    
    "match": {
    
    "age": 28}}
      ]
    }
  },
  "_source": ["gender","address","age"]
}

在这里插入图片描述

should可有可无,可贡献得分,不影响记录数

should:表示可有可无,如果匹配上就会提高该记录的得分,如果没有匹配上也不会影响查询结果集的数量

在这里插入图片描述

filter条件再过滤,不贡献得分

前面的must、must_not筛选出满足条件的记录,并贡献得分;should不会对满足must、must_not的记录数产生任何影响,但是它会对匹配should条件的记录贡献得分;而filter却不会贡献得分,只会在must、must_not的基础上对结果进行再过滤。

如下;在满足must的基础上,再筛选出age大于10并且小于30的记录
GET bank/_search
{
    
    
  "query": {
    
    
    "bool": {
    
    
      "must": [
        {
    
    "match": {
    
    "gender": "M"}},
        {
    
    "match": {
    
    "address": "mill"}}
      ],
      "filter": [
        {
    
    "range": {
    
    
          "age": {
    
    
            "gte": 10,
            "lte": 30
          }
        }}
      ]
    }
  },
  "_source": ["age","lastname","address"]
}

在这里插入图片描述

term和match

term 和 match 一样。匹配某个属性的值。只是全文检素(text)字段用 match,其他非text 字段匹配用 term。
在这里插入图片描述

match_phrase 和 .keyword

  • match_phrase:只要包含该短语就会被匹配上
  • ***.keyword: 必须是精确匹配

下图使用address字段进行了验证
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43859011/article/details/133996515