ElasticSearch的初步检索和进阶检索

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

一个是通过使用 REST request URI来发送搜索参数(uri + 检索参数)

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

 

另一个是通过 REST request body 来发送他们 (uri + 请求体)

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

 

1、match_all :查询所有#

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

 

2、match查询 #

全文检索会按照评分进行排序,会对检索条件进行分词匹配

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

 

3、match_phrase 【短语匹配】#

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

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

 

4、multi_match 【多字段匹配】#

也是分词查询

复制代码
// 查询 adress或者city中包含 mill的数据
GET bank/_search
{
  "query": {
    "multi_match": {
      "query": "mill",
      "fields": ["address","city"]
    }
  }
}
复制代码

 

5、filter #

只用于对数据进行过滤,不会计算相关性得分

复制代码
GET bank/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "age": {
            "gte": 10,
            "lte": 20
          }
        }
      }
    }
  }
}
复制代码

clipboard

 

6、term 查询#

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

复制代码
GET /bank/_search
{
  "query": {
    "term": {
      "balance": {
        "value": "32838"
      }
    }
  }
}
复制代码

 

7、aggregation (执行聚合)#

聚合提供了从数据中分组和提取数据的能力。最简单的聚合大致等于SQL的聚合函数。

在ElasticSearch中,你有执行搜索返回hit,并且同时返回聚合结果,把一个响应中所有hits分隔开的

能力,这是非常强大且有效的。您可以执行查询和多个聚合并且在一次使用中得到各自的返回结果,使用一次简介和简化的api来避免网络往返

 

语法:

复制代码
"aggregations" : {
    "<aggregation_name>" : {   //聚合名称
        "<aggregation_type>" : {  //聚合类型
            <aggregation_body>    //聚合体
        }
        [,"meta" : {  [<meta_data_body>] } ]?
        [,"aggregations" : { [<sub_aggregation>]+ } ]?
    },
    "<aggregation_name_2>" : { ... },
   "<aggregation_name_3>" : { ... } ....
}
复制代码

 

 

需求:

1)搜索address中包含mail的所有人的年龄和平均年龄,但不显示这些人的详情

复制代码
GET bank/_search
{
  "query": {
    "match": {
      "address": "mill"
    }
  },
  "aggs": {
    "ageagg": {
      "terms": {
        "field": "age",
        "size": 10
      }
    },
    "ageavg":{
      "avg": {
        "field": "age"
      }
    },
    "balanceavg":{
      "avg": {
        "field": "balance"
      }
    }
  }
}
复制代码

 

2)按照年龄聚合,并求这些年龄段的人的平均薪资

(聚合里面套聚合)

复制代码
GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "ageagg": {
      "terms": {
        "field": "age",
        "size": 10
      },
      "aggs": {
        "ageBalanceAvg": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}
复制代码

 

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

复制代码
GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "agegg": {  //聚合年龄
      "terms": { 
        "field": "age",
        "size": 100
      },
      "aggs": {
         "genderagg":{  //在年龄的聚合结果上聚合性别
            "terms": {
              "field": "gender.keyword",
              "size": 2
            },
            "aggs": {
              "balanceagg": {  //xx岁 M性别的平均薪资
                "avg": {
                  "field": "balance"
                }
              }
            }
        },
          "agebalanceaavg":{  //xx岁的平均薪资
            "avg": {
              "field": "balance"
            }
          }
      }
    }
  }
}
复制代码
posted @   青岑  阅读(145)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2019-12-18 Zuul 网关
2019-12-18 Feign
点击右上角即可分享
微信分享提示
主题色彩