一、ES基础概念(入门必懂)

1. 核心组件

组件 作用说明 类比关系
索引(Index) 存储相似结构数据的集合(非关系型表) 类似MySQL的Database
文档(Document) 索引中的最小数据单元(JSON格式) 类似MySQL的Row
字段(Field) 文档中的属性 类似MySQL的Column
分片(Shard) 索引的拆分单元(水平扩展) 类似数据库分表
副本(Replica) 分片的备份(高可用+负载均衡) 类似数据备份

2. 核心架构图(简化版)

客户端

集群节点1(主节点)

集群节点2(数据节点)

集群节点3(数据节点)

索引1-分片1

索引1-副本1

索引1-分片2

索引2-分片1

索引1-副本2

索引2-副本1

二、ES基础使用(上手实操)

1. 环境搭建(以7.17版本为例)

(1)单节点部署(Windows)
  1. 下载安装包:ES官网
  2. 解压后修改配置(config/elasticsearch.yml):
    cluster.name: my-first-cluster  # 集群名
    node.name: node-1               # 节点名
    network.host: 0.0.0.0           # 允许外部访问
    http.port: 9200                 # HTTP端口
    discovery.type: single-node     # 单节点模式
    
  3. 启动:双击bin/elasticsearch.bat
  4. 验证:访问http://localhost:9200,返回如下表示成功:
    {
      "name" : "node-1",
      "cluster_name" : "my-first-cluster",
      "version" : { "number" : "7.17.0" }
    }
    
(2)可视化工具(Kibana)
  • 下载对应版本Kibana,修改config/kibana.yml:
    elasticsearch.hosts: ["http://localhost:9200"]  # 关联ES地址
    
  • 启动后访问http://localhost:5601,进入Dev Tools(控制台)操作ES。

2. 基础CRUD操作(用Kibana控制台)

(1)创建索引(Index)
PUT /user_index  # 索引名(小写)
{
  "settings": {
    "number_of_shards": 1,    # 主分片数(默认5,单节点建议1)
    "number_of_replicas": 0   # 副本数(单节点建议0,否则报错)
  }
}
(2)添加文档(Document)
POST /user_index/_doc/1  # 文档ID=1(不指定则自动生成)
{
  "name": "张三",
  "age": 25,
  "gender": "男",
  "address": "北京市朝阳区"
}
(3)查询文档
  • 按ID查询:
    GET /user_index/_doc/1
    
  • 简单匹配查询(查地址含“北京”的用户):
    GET /user_index/_search
    {
      "query": {
        "match": { "address": "北京" }
      }
    }
    
(4)修改/删除文档
# 修改(全量更新)
PUT /user_index/_doc/1
{
  "name": "张三",
  "age": 26,  # 年龄从25改为26
  "gender": "男",
  "address": "北京市朝阳区"
}

# 删除
DELETE /user_index/_doc/1

三、ES进阶配置(功能深化)

1. 自定义映射(Mapping)

默认映射会自动识别字段类型,复杂场景需手动配置(如分词、日期格式):

PUT /article_index
{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1,
    "analysis": {  # 自定义分词器(中文分词用ik)
      "analyzer": {
        "my_ik_analyzer": {
          "type": "ik_max_word"  # ik细粒度分词
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",          # 可分词文本(用于搜索)
        "analyzer": "my_ik_analyzer",
        "fields": {
          "keyword": {
            "type": "keyword",  # 不分词(用于排序/聚合)
            "ignore_above": 256
          }
        }
      },
      "content": { "type": "text", "analyzer": "my_ik_analyzer" },
      "publish_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" },  # 自定义日期格式
      "author": { "type": "keyword" }
    }
  }
}

映射配置图说明
article_index索引中,title字段同时支持“分词搜索”(text类型)和“精确匹配”(keyword子字段),publish_time指定日期格式避免解析错误,content用IK分词器适配中文搜索。

2. 分片与副本优化(集群场景)

(1)分片配置原则
  • 单分片大小建议10-50GB(太大影响恢复速度)
  • 分片数=节点数×1.5~3(避免分片不均)
(2)动态调整副本数(集群扩容后)
PUT /article_index/_settings
{
  "number_of_replicas": 2  # 副本数从1改为2(提升可用性)
}

分片副本架构图

subgraph 集群(3节点)
    A[节点1] --> A1[article_index-分片0(主)]
    A --> A2[article_index-分片1(副本)]
    B[节点2] --> B1[article_index-分片1(主)]
    B --> B2[article_index-分片0(副本)]
    C[节点3] --> C1[article_index-分片0(副本)]
    C --> C2[article_index-分片1(副本)]

四、ES高级实战(精通必备)

1. 复杂查询与聚合分析

(1)布尔查询(多条件组合)

查询“2023年发布且作者为‘李四’,内容含‘Elasticsearch’”的文章:

GET /article_index/_search
{
  "query": {
    "bool": {
      "must": [  # 必须满足
        { "match": { "content": "Elasticsearch" } },
        { "term": { "author": "李四" } }  # keyword类型用term查询(精确匹配)
      ],
      "filter": [  # 过滤(不影响评分,性能更高)
        { "range": { "publish_time": { "gte": "2023-01-01 00:00:00" } } }
      ]
    }
  },
  "sort": [ { "publish_time": { "order": "desc" } } ],  # 按发布时间倒序
  "from": 0, "size": 10  # 分页(第1页,10条/页)
}
(2)聚合分析(统计维度)

统计“每个作者的文章数量”并按数量排序:

GET /article_index/_search
{
  "size": 0,  # 不返回具体文档,只返回聚合结果
  "aggs": {
    "author_article_count": {  # 聚合名称(自定义)
      "terms": {
        "field": "author",  # 按author字段分组
        "size": 10,         # 返回前10个分组
        "order": { "_count": "desc" }  # 按数量倒序
      }
    }
  }
}

聚合结果示意图

作者 文章数量
李四 25
王五 18
张三 12

2. 性能优化技巧

(1)索引层优化
  • 冷热分离:将历史数据(冷数据)迁移到低配置节点,热数据用高配置节点
  • 关闭无用功能:如不需要实时统计,关闭fielddata
    "properties": {
      "unused_field": {
        "type": "text",
        "fielddata": false  # 关闭fielddata
      }
    }
    
(2)查询层优化
  • 优先用filter代替mustfilter结果缓存,不计算评分)
  • 避免通配符开头查询(如*search,会导致全表扫描)
  • 大结果集用scrollsearch_after(替代深分页from/size

3. 集群监控与故障处理

(1)集群健康检查
GET /_cluster/health
# 健康状态:green(所有分片可用)> yellow(副本不可用)> red(主分片不可用)
(2)节点故障转移

当主节点故障时,ES会自动从候选节点(node.master: true)中选举新主节点,配置候选节点:

# elasticsearch.yml
node.master: true    # 允许成为主节点候选
node.data: true      # 同时作为数据节点(小规模集群推荐)
node.ingest: true    # 允许处理数据预处理

五、学习路径总结

  1. 入门阶段:掌握基础概念→完成单节点部署→熟练CRUD操作
  2. 进阶阶段:自定义映射→分片副本配置→复杂查询(布尔/范围查询)
  3. 精通阶段:聚合分析→性能优化→集群管理→故障处理

建议按“实操→问题→解决”的循环学习,比如先尝试搭建集群,遇到分片分配错误时,再回头深入理解分片副本机制。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐