Loading

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 @ 2020-12-18 23:25  青岑  阅读(137)  评论(0编辑  收藏  举报