首页 > 其他分享 >Elasticsearch 进阶检索 (一)

Elasticsearch 进阶检索 (一)

时间:2022-10-06 14:57:34浏览次数:71  
标签:检索 search 进阶 GET 查询 Elasticsearch bank query match

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"
          }

        }
      }
    }
  }
}

 

 

 

 

标签:检索,search,进阶,GET,查询,Elasticsearch,bank,query,match
From: https://www.cnblogs.com/mangoubiubiu/p/16757599.html

相关文章

  • SQLMap进阶:参数讲解
    1、--level5:探测等级 —level5参数代表需要执行的测试等级为5,一共有5个测试等级1~5,可不加level,不加等级参数默认是1。SQLMap使用的Payload可以在xml/poyloads.xml中看......
  • Elasticsearch 初步检索
    1丶_catGET/_cat/nodes:查看所有节点GET/_cat/health:查看es健康状况GET/_cat/master:查看主节点GET/_cat/indices:查看所有索引相当于showdatabase查......
  • ElasticSearch Head
    ElasticSearchHead在谷歌浏览器安装ElasticSearchHead谷歌浏览器----右上角---扩展程序---搜索ElasticSearchHead插件基于插件可以查看ElasticSearch相关数据和集......
  • Docker 安装 Elasticsearch
    1、下载镜像文件#存储和检索数据dockerpullelasticsearch:7.4.2#可视化检索数据dockerpullkibana:7.4.22、创建实例1、创建数据卷映射目录及相关配置mkdir-p......
  • python装饰器进阶指南
    前言最近一有时间就在整理自己常用的代码片段,并做成了私人pip包,正好整理到了装饰器的部分,所以就想着写篇文章来总结一下。写这篇文章的目的是为了让大家对装饰器有一个更......
  • python基础小知识【基础+进阶】
    ......
  • ElasticSearch-7.10版本最新万字长文教程【距离搞懂ELK核心你只差这一片文章】
    ES万字长文教程​​一、认识ELK、ES​​​​1.什么是ELK?​​​​2.什么是ElasticSearch​​​​3.ElasticSearch下载安装教程​​​​二、索引的CRUD​​​​1.创建索引​​......
  • 手写现代前端框架diff算法-前端面试进阶
    前言在前端工程上,日益复杂的今天,性能优化已经成为必不可少的环境。前端需要从每一个细节的问题去优化。那么如何更优,当然与他的如何怎么实现的有关。比如key为什么不能使用......
  • 【运维实战】3.FastDFS分布式的文件存储系统进阶API使用实践
    ​本章目录:0x00FastDFSAPI使用实践JavaPython0x01FastDFS基础命令与配置1.FastDFS客户端命令浅析2.FastDFS服务端配置浅析0x00FastDFSAPI使用实践Java描述:Fast......
  • Vue.$nextTick的原理是什么-vue面试进阶
    原理性的东西就会文字较多,请耐下心来,细细品味Vue中DOM更新机制当你气势汹汹地使用Vue大展宏图的时候,突然发现,咦,我明明对这个数据进行更改了,但是当我获取它的时候怎么是上......