Elasticsearch 进阶检索 (一)

1、官方文档

https://www.elastic.co/guide/en/elasticsearch/reference/7.4/index.html

SearchAPI

ES 支持两种基本方式检索:

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

2、检索信息

一、切检索从_search开始

GET bank/_search

检索bank下所有信息,包括type和docs

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

请求参数方式检索

入参Params解释:

q=* 查询所有

sort=account_number:asc 按照account_number 升序排列

 

响应结果解释:

took-Elasticsearch 执行搜索的时间(毫秒)

time_out 告诉我们搜索是否超时

_shards- 告诉我们多少个分片被搜索了,以及统计了成功/失败的搜索分片

hits- 搜索结果

hits.total- 搜索结果

hits.hits- 实际的搜索结果数组(默认为前10的文档)

sort- 结果的排序 key (键) (没有则按score 排序)

score- 和 max_score - 相关性得分和最高得分(全文检索用)

 

 

二、uri+请求体进行检索

 

GET /bank/_search

{

"query": {

"match_all": {}

},

"sort": [{

"account_number": "asc"

}]

}

 

HTTP 客户端工具(POSTMAN),get请求不能携带请求体,我们变为post也是一样的 我们post一个JSON风格的查询请求体到_searchAPI。

需要了解 ,一旦搜索的结果被返回,Elasticsearch 就完成了这次请求,并不会维护任何服务端的资源或者结果的cursor(游标)

 

 

 

 

3、Query DSL

1)、基本语法格式

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

  • 一个查询语句 的典型结构
{
  QUERY_NAME:{
     ARGUMENT: VALUE,
     ARGUMENT:VALUE,.....
 }
}
  • 如果是针对某个字段,那么它的结构如下:
{
  QUERY_NAME:{
      FIELD_NAME:{
        AGRUMENT: VALUE,
        AGRUMENT: VALUE,.......
    }   
  }
}

GET /bank/_search

{

"query": {

"match_all": {}

 

},

"from": 0,

"size": 5,

"sort": [

{

"balance": {

"order": "desc"

}

}

]

}

  • query 定义如何查询
  • matcha_all 查询类型【代表查询所有的所有】,es 中可以在query中组合非常多的查询类型完成复杂查询
  • 除了query参数之外,我们也可以传递其它的参数以改变查询结果。如sort,size
  • from+size 限定,完成分页功能
  • sort排序,多字段排序,会在前序字段相等时后续字段内部排序,否则以前序为准

 

2)、返回部分字段

复制代码
GET /bank/_search
{
  "query": {
    "match_all": {}
    
  },
  "from": 0,
  "size": 5, 
  "sort": [
    {
      "balance": {
        "order": "desc"
      }
    }
  ],
  "_source": ["balance","firstname"]
}
复制代码

3)、match 【匹配查询】

一、基本类型(非字符串),精确匹配

复制代码
GET bank/_search
{
    "query": {
     "match": {
       "account_number": 20
     }
    
  }
}
复制代码

match 返回 account_number = 20 的

二、字符串,全文检索

复制代码
GET bank/_search
{
    "query": {
     "match": {
       "address": "mill road"
     }
    
  }
}
复制代码

最终查出address中包含mill 或者 road 或者 mill road 的所有记录,并给出相关性得分。全文检索按照评分进行排序,会对检索条件进行分词匹配。

复制代码
GET bank/_search
{
    "query": {
     "match": {
       "address.keyword": "694 Jefferson"
     }
    
  }
}
复制代码

加了 .keyword 变成精确匹配 意思是 address = 694 Jefferson 才能被匹配出来,

和下面match_phrase 的区别是 match_phrase 是短句匹配 address 中只要有 694 Jefferson 就能被查出来

4)、match_phrase 【短句查询】

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

复制代码
GET bank/_search
{
    "query": {
     "match_phrase": {
       "address": "mill road"
     }
    
  }
}
复制代码

state 或者 address 包含 mill 或者 movico(注意 这里是分词查询!!!!)

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

 
复制代码
GET bank/_search
{
    "query": {
      "bool": {
        "must": [
          {"match": {
            "gender": "M"
           }
          },
           {"match": {
            "address": "mill"
           }
          }
        ],
        "must_not": [
          {"match": {
            "age": "28"
          }}
        ]
        ,"should": [
          {"match": {
            "lastname": "Wallace"
          }}
        ]
      }
    
  }
}
复制代码

must 一定匹配 gender 一定是 M 的 must_not 一定不匹配 age 不等于 28 should 应该匹配 lastname 等于 Wallance 不等于也没有关系 也可以查出来

7)、filter 【结果过滤】

并不是所有的查询都需要产生分数,特别是那些仅用于“filteing” (过滤)的文档。为了不计算分数Elasticsearch会自动检查场景并且优化查询的执行。

 
复制代码
GET bank/_search
{
    "query": {
      "bool": {
        "must": [
          {"match": {
            "gender": "M"
           }
          },
           {"match": {
            "address": "mill"
           }
          }
        ],
        "must_not": [
          {"match": {
            "age": "28"
          }}
        ]
        ,"should": [
          {"match": {
            "lastname": "Wallace"
          }}
        ],  
        "filter": {
          "range": {
            "age": {
              "gte": 10,
              "lte": 50
            }
          }
        }
      }
    
  }
}
复制代码

filter不会计算相关性得分 只会对上一些条件查出的结果进行过滤,类似于JAVA stream 流 的 filter

8)、term

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

GET bank/_search
{
  "query": {
    "term": {
      "age": "28"
    } 
  }
}

9)、aggregations(执行聚合)

聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于SQL GROUP BY SQL 聚合函数。在Elasticsearch中,您有执行搜索返回hits(命中结果)分隔开的能力。这是非常强大且有效的,您可以执行查询和多个聚合,并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的API来避免网络往返。

一、搜索address 中包含 mill的所有人的年龄分布以及平均年龄,但不显示这些人的详情。

复制代码
GET bank/_search
{
    "query": {
     "match": {
       "address": "mill"
     }
    
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 10
      }
    },
    "ageAvg":{"avg": {
      "field": "age"
    }},
    "balanceAvg":{
      "avg": {
        "field": "balance"
      }
    }
  },
  "size": 0
}
复制代码

ageAgg 查询年龄分布情况即 年龄为 30的有多少人

ageAvg 求age的平均值

balanceAvg 求balance的平均值

size = 0 返回值不返回查询的结果只返回聚合 aggregations 的结果

二、进阶 按照年龄聚合,并且请求这些年龄段的这些人的平均薪资。

复制代码
GET bank/_search
{
  "query": {
    "match_all": {}
  }
  , "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 100
      },
      "aggs": {
        "ageAvg": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}
复制代码

先按照年龄聚合,在求这些年龄段的平均薪资。

三、查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资。

复制代码
GET bank/_search
{
  "query": {
    "match_all": {}
  }
  , "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 100
      },
      "aggs": {
        "genderAgg": {
          "terms": {
            "field": "gender.keyword",
            "size": 10
          },
        "aggs": {
          "balanceAvg":{
            "avg": {
            "field": "balance"
          }
          }
        }
        },
        "ageBananceAvg":{
          "avg": {
            "field": "balance"
          }

        }
      }
    }
  }
}
复制代码

 

 

 

 

本文作者:KwFruit

本文链接:https://www.cnblogs.com/mangoubiubiu/p/16757599.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   KwFruit  阅读(45)  评论(0编辑  收藏  举报
历史上的今天:
2020-10-06 上传头像开发-集成阿里云OSS
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起