侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 352 篇文章
  • 累计创建 135 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

ES教程13-ElasticSearch搜索实战

孔子说JAVA
2022-10-18 / 0 评论 / 0 点赞 / 58 阅读 / 7,810 字 / 正在检测是否收录...
广告 广告

Elasticsearch是一个分布式文档存储。Elasticsearch不会将信息存储为列数据的行,而是存储已序列化为JSON文档的复杂数据结构。当集群中有多个Elasticsearch节点时,存储的文档将分布在集群中,并且可以从任何节点立即访问。存储文档时,将在1秒钟内几乎实时地对其进行索引和完全搜索。本文对一些常用的ES查询方式做了归纳整理,以便备查。

1、数据准备

本文使用的 Elasticsearch 版本是 7.17.3,所有操作都是使用 Kibana 来完成。

1.1 查询索引

1)索引集群情况

# 查询所有索引
GET /_cat/indices?v

# 查询索引指定列信息
GET /_cat/indices?v&h=health,status,index

image-1665971339068

image-1665971349250

2)所有索引

# 查询所有索引的信息
GET _all

# 获取所有索引的mapping信息
GET _all/_mapping

# 获取所有索引的settings信息
GET _all/_settings

3)指定索引

# 查询当前索引employee的信息
GET /employee

# 获取当前索引employee的mapping信息
GET /employee/_mapping

# 获取当前索引employee的settings信息
GET /employee/_settings

1.2 创建索引

索引操作详细介绍可查看:ES教程4-ES可视化工具elasticsearch-head的使用 - 索引与映射

1)只指定索引名称方式

PUT student

执行上述语句创建student索引后,通过 GET student 方式查询如下:

image-1665972275409

可以看到该索引mappings中没有任何内容,即该索引没有对应字段/属性。

2)指定索引mapping方式

通过 DELETE student 命令删除已经创建好的 student 索引,重新按指定索引mapping方式创建。

PUT student
{
  "mappings" : {
    "properties" : {
      "name" : {
        "type" : "keyword"
      },
      "age" : {
        "type" : "integer"
      },
      "height": {
        "type": "integer"
      }
    }
  }
}

image-1665972446505

通过 GET student 方式查询如下:

image-1665972481041

3)指定索引mapping和setting方式

PUT student
{
  "mappings" : {
    "properties" : {
      "name" : {
        "type" : "keyword"
      },
      "age" : {
        "type" : "integer"
      },
      "height": {
        "type": "integer"
      }
    }
  },
  "settings":{
    "index":{
        "number_of_shards": 5,
        "number_of_replicas": 1
    }
  }
}

在settings中,我们设置了分片数和副本数。

  • number_of_shards:分片的数量;
  • number_of_replicas:副本的数量;

1.3 删除索引

通过 DELETE 索引名 命令可以删除已经存在的索引。

DELETE 索引名

1.4 增加文档

文档操作详细介绍可查看:ES教程5-ES可视化工具elasticsearch-head的使用 - 文档操作

1)批量增加多个文档

因为我们需要多条测试数据,所以这里使用 _bulk 同时创建多个文档:

POST _bulk
{ "index" : { "_index" : "student", "_id" : "1" } }
{ "name" : "张三", "age": 12 }
{ "index" : { "_index" : "student", "_id" : "2" } }
{ "name" : "李四", "age": 10,  "height": 112 }
{ "index" : { "_index" : "student", "_id" : "3" } }
{ "name" : "王五", "age": 11, "height": 108 }
{ "index" : { "_index" : "student", "_id" : "4" } }
{ "name" : "赵六", "age": 11, "height": 111 }
{ "index" : { "_index" : "student", "_id" : "5" } }
{ "name" : "陈七", "age": 13, "height": 115 }
{ "index" : { "_index" : "student", "_id" : "6" } }
{ "name" : "钱麻子", "age": 10, "height": 113 }

image-1665972841481

2)增加单个文档

当然我们也可以增加单个文档,使用如下命令:

POST /student/_doc/7

image-1665973450053

其中的student是索引名;_doc是类型(ES7后type都是_doc);7代表这条数据的主键;如果id不填写,ES会自动生成一条主键。

2、数据查询

查询语法及示例详情请参考:

2.1 查询所有数据

# 查询所有数据
GET student/_search

也可以使用如下命令查询:

GET student/_search
{
  "query": {
    "match_all": {}
  }
}

或者使用post方式:

POST student/_search
{
  "query": {
    "match_all": {}
  }
}

2.2 指定单条件查询

查询张三的信息:

# 查询张三的信息
POST student/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  }
}

或者(term 查询会查找我们指定的精确值。term 查询是简单的,它接受一个字段名以及我们希望查找的数值)

POST student/_search
{
  "query": {
    "term": {
      "name": "张三"
    }
  }
}

或者(must的语句都必须匹配,与 AND 等价)

POST student/_search
{
  "query": {
    "bool": {
      "must": [
        { "term" : { "name": "张三" } }
      ]
    }
  }
}

image-1665973817635

2.3 指定多条件查询

  1. 查询 10 岁的张三的信息,因为没有数据,所以下面的查询结果为空:
POST student/_search
{
  "query": {
    "bool": {
      "must": [
        { "term" : { "name": "张三" } },
        { "term" : { "age": 10 } }
      ]
    }
  }
}

image-1665974007073

  1. 查询 11岁、12岁的所有学生信息

多个值精确查找使用terms query。

POST student/_search
{
  "query": {
    "bool": {
      "must": [
        { "terms" : { "age": [11, 12] } }
      ]
    }
  }
}

注意:这里写的是terms,不是 term。

image-1665974080419

2.4 范围查询

  1. 查询小于11岁的学生信息
POST student/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "age": {
              "lt": "11"
            }
          }
        }
      ]
    }
  }
}

image-1665974172683

  1. 查询11岁到13岁的学生信息
POST student/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "age": {
              "gte": "11",
              "lte": "13"
            }
          }
        }
      ]
    }
  }
}

2.5 存在与否查询

存在与否检索使用(exist query)查询。

  1. 查询有身高 height 记录的学生
POST student/_search
{
    "query": {
        "exists": {
            "field": "height"
        }
    }
}
  1. 查询没有身高 height 记录的学生
POST student/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": { "field": "height"}
        }
      ]
    }
  }
}

image-1665975089387

  1. 是否存在11岁的学生
POST student/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {"age": 11}
        }
      ]
    }
  },
  "from": 0,
  "size": 1
}

2.6 总人数查询

查询 11 岁的学生总人数。

  1. 方法一:bool查询
POST student/_count
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {"age": 11}
        }
      ]
    }
  }
}

image-1665975249751

  1. 方法二:使用聚合查询
POST student/_search
{
  "aggs":{
    "age_count": {
      "terms": {"field": "age"}
    }
  },
  "size": 0
}

image-1665975366345

  1. 方法三:查询后进行聚合
POST student/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {"age": 11} }
      ]
    }
  },
  "aggs":{
    "age_count": {
      "terms": {"field": "age"}
    }
  },
  "size": 0
}

image-1665975454635

  1. 方法四
POST student/_search
{
  "size": 0,
  "aggregations": {
    "group_by_age": {
      "aggregations": {
        "count_age": {
          "value_count": {
            "field": "_index"
          }
        }
      },
      "terms": {
        "field": "age"
      }
    }
  }
}

2.7 平均值查询

查询学生的平均岁数。

  1. stats 指令,会计算出指定字段的 count、min、max、avg、sum。
POST student/_search
{
  "aggs":{
    "age_stat": {
      "stats": {"field": "age"}
    }
  },
  "size": 0
}

image-1665975629768

  1. 只查询年龄平均值
POST student/_search
{
  "aggs":{
    "age_stat": {
      "avg": {"field": "age"}
    }
  },
  "size": 0
}

image-1665976069460

  1. 每个年龄的平均身高是多少?
POST student/_search
{
  "size": 0,
  "aggregations": {
    "group_by_age": {
      "aggregations": {
        "avg_height": {
          "avg": {
            "field": "height"
          }
        }
      },
      "terms": {
        "field": "age"
      }
    }
  }
}

image-1665976394706

聚合函数:

POST student/_search
{
  "size": 0,
  "aggs": {
    "avg_sal": {
      "avg": {
        "field": "age"
      }
    },
    "max_val": {
      "max": {
        "field": "age"
      }
    },
    "min_val": {
      "min": {
        "field": "age"
      }
    },
    "sum_val": {
      "sum": {
        "field": "age"
      }
    }
  }
}

2.8 分组平均并排序

获取每个年龄的平均身高,并按照年龄从小到大排序。

  1. 方式一
POST student/_search
{
  "size": 0,
  "aggregations": { 
    "group_by_age": {
      "aggregations": {
        "avg_height": {
          "avg": {
            "field": "height"
          }
        }
      },
      "terms": {
        "field": "age",
        "order": {
          "_term": "asc"
        }
      }
    }
  }
}

image-1665976506096

  1. 方式二
POST student/_search
{
  "size": 0,
  "aggregations": { 
    "group_by_age": {
      "aggregations": {
        "avg_height": {
          "avg": {
            "field": "height"
          }
        },
        "bucket_sort_by_avg_height": {
          "bucket_sort": {
            "sort": [
              {"_key": {"order": "asc"}}
            ]
          }
        }
      },
      "terms": {
        "field": "age"
      }
    }
  }
}
  1. 获取每个年龄的平均身高,并按照平均身高从大到小排序
POST student/_search
{
  "size": 0,
  "aggregations": { 
    "group_by_age": {
      "aggregations": {
        "avg_height": {
          "avg": {
            "field": "height"
          }
        },
        "bucket_sort_by_avg_height": {
          "bucket_sort": {
            "sort": [
              {"avg_height": {"order": "desc"}}
            ]
          }
        }
      },
      "terms": {
        "field": "age"
      }
    }
  }
}

image-1665976650784

2.9 最大最小值查询

最高的学生是谁,最高的学生可能有多个。

  • 方式1:找到最高的身高值,然后根据身高搜索学生信息。
  • 方式2:按照身高排序。找到第1个的身高,然后根据身高搜索所有学生信息。
  • 方式3:使用聚合函数查询
POST student/_search
{
  "query": {
    "match_all": {}
  },
  "sort" : [
    {"height": {"order": "desc"}}
  ],
  "from": 0,
  "size": 1
}

image-1665976798860

0

评论区