ElasticSearch进阶篇之-Query DSL

举报
波波烤鸭 发表于 2022/03/30 01:14:24 2022/03/30
【摘要】 ElasticSearch官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/getting-started-search.h...

在这里插入图片描述

ElasticSearch官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/getting-started-search.html

1.ES中的检索方式

在ElasticSearch中支持两种检索方式

  1. 通过使用REST request URL 发送检索参数(uri+检索参数)
  2. 通过使用 REST request body 来发送检索参数 (uri+请求体)

第一种方式

GET bank/_search # 检索bank下的所有信息,包括 type 和 docs

GET bank/_search?q=*&sort=account_number:asc

响应结果信息

信息 描述
took ElasticSearch执行搜索的时间(毫秒)
time_out 搜索是否超时
_shards 有多少个分片被搜索了,统计成功/失败的搜索分片
hits 搜索结果
hits.total 搜索结果统计
hits.hits 实际的搜索结果数组(默认为前10条文档)
sort 结果的排序key,没有就按照score排序
score和max_score 相关性得分和最高分(全文检索使用)

image.png

第二种方式

通过使用 REST request body 来反射检索参数 (uri+请求体)

GET bank/_search

{
   "query":{
       "match_all":{}
    },
    "sort":[
       {
           "account_number":"desc"  
       }
   ]
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

image.png

2.Query DSL

2.1 基本语法

  ElasticSearch提供了一个可以执行的JSON风格的DSL(domain-specific language 领域特定语言),这个被称为Query DSL,该查询语言非常全面,并且刚开始的时候感觉有点复杂,真正学好它的方法就是从一些基础案例开始的。

完整的语法结构

{
   QUERY_NAME:{
      ARGUMENT:VALUE,
      ARGUMENT:VALUE,...
   }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

如果是针对某个字段,那么它的结构为

{
    QUERY_NAME:{
        FIELD_NAME:{
            ARGUMENT:VALUE,
            ARGUMENT:VALUE,...
        }
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

image.png

2.2 match

  上面我们用到来的match_all是匹配所有的数据,而我们现在要讲的match是条件匹配

如果对应的字段是基本类型(非字符串类型),则是精确匹配。

GET bank/_search
{
   "query":{
       "match":{
          "account_number":20
      }
   }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

match返回的是 account_number:20的记录

image.png

如果对应的字段是字符串类型,则是全文检索

GET bank/_search
{
   "query":{
       "match":{
          "address":"mill"
      }
   }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

match返回的就是address中包含mill字符串的记录

image.png

2.3 match_phrase

将需要匹配的值当成一个整体单词(不分词)进行检索,短语匹配

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

查询出address中包含 mill road的所有记录,并给出相关性得分

image.png

2.4 multi_match[多字段匹配]

GET bank/_search
{
   "query":{
       "multi_match":{
          "query":"mill road",
          "fields":["address","state"]
      }
   }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

查询出state或者address中包含 mill road的记录

image.png

2.5 bool[复合查询]

布尔查询又叫组合查询,bool用来实现复合查询,

bool把各种其它查询通过 must(与)、must_not(非)、should(或)的方式进行组合

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

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

image.png

2.6 filter[结果过滤]

  并不是所有的查询都需要产生分数,特别是那些仅用于"filtering"的文档,为了不计算分数,ElasticSearch会自动检查场景并且优化查询的执行。

GET /bank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

image.png

2.7 term

  和match一样,匹配某个属性的值,全文检索字段用match,其他非text字段匹配用term

GET bank/_search
{
   "query":{
       "term":{
          "account_number":20
      }
   }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

image.png

检索关键字 描述
term 非text使用
match 在text中我们实现全文检索-分词
match keyword 在属性字段后加.keyword 实现精确查询-不分词
match_phrase 短语查询,不分词,模糊查询

好了索引查询这块就介绍到这儿了

文章来源: dpb-bobokaoya-sm.blog.csdn.net,作者:波波烤鸭,版权归原作者所有,如需转载,请联系作者。

原文链接:dpb-bobokaoya-sm.blog.csdn.net/article/details/122952892

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。