Elasticsearch 完全指南

发布于:2025-03-31 ⋅ 阅读:(31) ⋅ 点赞:(0)

1. Elasticsearch基础知识

1.1 什么是Elasticsearch

Elasticsearch是一个基于Lucene的分布式、RESTful风格的搜索和数据分析引擎。它是一个开源的、高扩展的、分布式的全文搜索引擎,可以近乎实时地存储、检索数据。

Elasticsearch不仅仅是一个全文搜索引擎,它还可以用于以下场景:

  • 应用程序搜索
  • 网站搜索
  • 企业搜索
  • 日志处理和分析
  • 指标和容器监控
  • 应用性能监控
  • 地理空间数据分析和可视化
  • 安全分析
  • 业务分析

1.2 Elasticsearch的特点和优势

核心特点

  1. 分布式架构

    • 可以轻松扩展到上百台服务器,处理PB级数据
    • 自动管理集群节点的添加和移除
  2. RESTful API

    • 提供简单而统一的RESTful API
    • 支持JSON格式的数据交换
  3. 近实时搜索

    • 数据添加到索引后,通常在1秒内即可被搜索到
  4. 高可用性

    • 支持多节点集群,具备故障转移功能
    • 自动数据备份和恢复
  5. 文档导向

    • 以JSON文档为中心,支持复杂嵌套对象
    • 无需预定义模式,可动态调整
  6. 全文搜索能力

    • 强大的全文搜索功能
    • 支持多种语言和自定义分析器

主要优势

  1. 速度:利用倒排索引等技术实现高速搜索
  2. 可扩展性:横向扩展能力强,可根据负载添加节点
  3. 灵活性:无模式(Schema-less)设计,适应不同数据需求
  4. 易用性:简单的API和丰富的客户端库
  5. 分析能力:强大的聚合功能,可进行复杂数据分析
  6. 多语言支持:内置多种语言分析器
  7. 实时性:近实时索引和搜索

1.3 Elasticsearch的核心概念

基本术语

  1. 节点(Node):Elasticsearch的单个运行实例,即一个服务器

    • 主节点(Master Node):负责集群管理工作
    • 数据节点(Data Node):存储数据和执行数据相关操作
    • 协调节点(Coordinating Node):接收客户端请求,将请求分发到其他节点
    • 摄取节点(Ingest Node):预处理数据的节点
  2. 集群(Cluster):一个或多个节点共同工作的集合

    • 每个集群有唯一的名称
    • 默认集群名为"elasticsearch"
  3. 索引(Index):包含相似特性文档的集合

    • 类似关系型数据库中的"数据库"
    • 一个集群可以有多个索引
  4. 类型(Type):索引内部的逻辑分类/分区

    • 在Elasticsearch 7.0以后被弃用,一个索引只能有一个类型
    • 在Elasticsearch 6.x中,默认类型名为"_doc"
  5. 文档(Document):可被索引的基本信息单元

    • 以JSON格式表示
    • 每个文档有一个唯一的ID
    • 类似关系型数据库中的"行"
  6. 字段(Field):文档中包含的数据项

    • 类似关系型数据库中的"列"
    • 每个字段有特定的数据类型
  7. 分片(Shard):索引分成的多个部分

    • 主分片(Primary Shard):索引的原始分片,默认5个
    • 副本分片(Replica Shard):主分片的复制,默认1个
  8. 映射(Mapping):定义索引中字段的存储和索引方式

    • 定义字段类型、分析器等
    • 可自动生成或手动指定
  9. 分析器(Analyzer):处理文本的组件,用于索引和搜索

    • 由字符过滤器、分词器和词项过滤器组成
  10. 节点发现(Discovery):节点相互发现并加入集群的过程

1.4 Elasticsearch与关系型数据库的对比

关系型数据库 Elasticsearch 说明
数据库(Database) 索引(Index) 数据存储和组织的最高级别
表(Table) 类型(Type)/无 ES 7.0后一个索引只能有一个隐含类型
行(Row) 文档(Document) 基本数据单元
列(Column) 字段(Field) 数据项
模式(Schema) 映射(Mapping) 数据结构定义
主键(Primary Key) _id 唯一标识符
索引(Index) 倒排索引 加速查询的数据结构
SQL 查询DSL 查询语言
SELECT GET 检索数据操作
INSERT PUT/POST 插入数据操作
UPDATE PUT/POST 更新数据操作
DELETE DELETE 删除数据操作
JOIN 嵌套/父子文档 关联数据处理
事务(Transaction) 无完整事务支持 数据一致性控制
表分区(Partition) 分片(Shard) 数据分布

主要区别

  1. 存储模型:关系型数据库基于行/列,Elasticsearch基于文档
  2. 查询语言:SQL vs JSON查询DSL
  3. 扩展方式:关系型垂直扩展,Elasticsearch水平扩展
  4. 事务:关系型支持ACID,Elasticsearch最终一致性
  5. 实时性:Elasticsearch近实时,关系型数据库实时或批处理
  6. 搜索能力:Elasticsearch专为搜索优化,支持复杂全文搜索

2. Windows环境下安装与配置Elasticsearch

2.1 下载安装包

  1. 访问Elasticsearch官方网站的下载页面:

    https://www.elastic.co/cn/downloads/elasticsearch
    
  2. 选择适合的版本(本教程以7.8.0版本为例)

  3. 下载Windows版本(ZIP或MSI格式)

    • ZIP格式:便于自定义安装,适合开发环境
    • MSI格式:更适合生产环境,支持作为系统服务安装

2.2 安装步骤详解

使用ZIP包安装

  1. 解压ZIP包

    • 将下载的elasticsearch-7.8.0-windows-x86_64.zip解压到指定目录
    • 例如:C:\elasticsearch-7.8.0
    • 注意:路径不应包含空格和特殊字符
  2. 目录结构

解压后的目录结构如下:

elasticsearch-7.8.0/
├── bin/          # 可执行文件目录
├── config/       # 配置文件目录
├── data/         # 数据存储目录
├── jdk/          # 内置JDK目录
├── lib/          # 依赖库目录
├── logs/         # 日志文件目录
├── modules/      # 模块目录
├── plugins/      # 插件目录
└── LICENSE.txt   # 许可证文件

2.3 配置文件详解

Elasticsearch的主要配置文件位于config目录下,主要包括:

elasticsearch.yml(核心配置文件)

# ======================== Elasticsearch配置 =========================
#
action.destructive_requires_name: true
# 节点名字
node.name: el_node_m1
 
#设置对外服务的http端口,默认为9200
http.port: 9008
 
#设置索引数据的存储路径
path.data: D:\Config\Elasticsearch\elasticsearch-7.8.0\data   #换成自己的路径
#设置日志文件的存储路径
path.logs: D:\Config\Elasticsearch\elasticsearch-7.8.0\data  #换成自己的路径
 
# 关闭http访问限制
xpack.security.enabled: false
 
# 增加新的参数,head插件可以访问es
http.cors.enabled: true
http.cors.allow-origin: "*"

# 跨域设置
#
http.cors.enabled: true                # 启用CORS
http.cors.allow-origin: "*"            # 允许的来源

2.4 启动与停止服务

ZIP安装方式

  1. 启动Elasticsearch

    • 打开命令提示符(CMD),进入Elasticsearch安装目录的bin文件夹
    • 执行以下命令:
      elasticsearch.bat
      
    • 首次启动可能需要允许防火墙访问
  2. 停止Elasticsearch

    • 按下Ctrl+C终止进程
  3. 验证安装

    • 打开浏览器,访问:http://localhost:9200
    • 如果安装成功,将看到类似以下JSON响应:
    {
      "name" : "node-1",
      "cluster_name" : "my-application",
      "cluster_uuid" : "xkpkbYrqQmOqvKCKl-2O3A",
      "version" : {
        "number" : "7.17.0",
        "build_flavor" : "default",
        "build_type" : "zip",
        "build_hash" : "bee86328705acaa9a6daede7140defd4d9ec56bd",
        "build_date" : "2022-01-28T08:36:04.875279988Z",
        "build_snapshot" : false,
        "lucene_version" : "8.11.1",
        "minimum_wire_compatibility_version" : "6.8.0",
        "minimum_index_compatibility_version" : "6.0.0-beta1"
      },
      "tagline" : "You Know, for Search"
    }
    

2.5 安装常用插件

Elasticsearch插件可以扩展其功能,以下是常用插件的安装方法:

安装IK中文分词器

IK分词器是最常用的中文分词插件,支持自定义词典。

  1. 下载与Elasticsearch版本匹配的IK分词器

    • 访问GitHub项目页面:https://github.com/medcl/elasticsearch-analysis-ik/releases
    • 下载与Elasticsearch版本相匹配的发行版,例如:elasticsearch-analysis-ik-7.8.0.zip
  2. 安装IK分词器

    • 创建插件目录:mkdir C:\elasticsearch-7.8.0\plugins\analysis-ik
    • 解压下载的ZIP文件到该目录
    • 重启Elasticsearc

安装拼音分词器

  1. 下载与Elasticsearch版本匹配的拼音分词器

    • 访问GitHub项目页面:https://github.com/medcl/elasticsearch-analysis-pinyin/releases
    • 下载与Elasticsearch版本相匹配的发行版,例如:elasticsearch-analysis-pinyin-7.8.0.zip
  2. 安装IK分词器

    • 创建插件目录:mkdir C:\elasticsearch-7.8.0\plugins\analysis-pinyin
    • 解压下载的ZIP文件到该目录
    • 重启Elasticsearc

2.6 安装Kibana可视化工具

Kibana是Elastic Stack的一部分,提供了强大的可视化和管理界面。

  1. 下载Kibana

    • 访问官方网站:https://www.elastic.co/cn/downloads/kibana
    • 选择与Elasticsearch版本相匹配的Windows版本(7.8.0)
  2. 解压缩

    • 将下载的zip文件解压到指定目录,例如:C:\kibana-7.8.0-windows-x86_64
  3. 配置Kibana

    • 编辑配置文件:C:\kibana-7.8.0-windows-x86_64\config\kibana.yml
    • 设置Elasticsearch URL(如果需要):
      elasticsearch.hosts: ["http://localhost:9200"]
      
  4. 启动Kibana

    • 打开命令提示符,进入Kibana目录
    • 执行命令:bin\kibana.bat
  5. 访问Kibana界面

    • 打开浏览器,访问:http://localhost:5601

3. Elasticsearch核心概念深入解析

3.1 分布式架构

Elasticsearch采用分布式架构,具有以下特点:

  1. 无中心设计

    • 集群中没有单点故障
    • 任何节点都可以加入集群或离开集群
    • 自动选举主节点
  2. 分片与副本机制

    • 数据分散存储在多个分片上
    • 每个分片可以有多个副本,提高可用性
  3. 自动发现与自愈

    • 节点间使用Zen Discovery相互发现
    • 自动处理节点故障和数据重新分配
  4. 水平扩展能力

    • 可以随时添加新节点扩展集群容量
    • 自动数据再平衡

集群状态颜色

Elasticsearch集群状态使用颜色表示:

  • 绿色:所有主分片和副本分片都正常运行
  • 黄色:所有主分片正常运行,但至少有一个副本分片不可用
  • 红色:至少有一个主分片不可用

3.2 集群与节点

集群类型
  1. 单节点集群

    • 开发环境常用
    • 无故障转移保护
  2. 多节点集群

    • 生产环境推荐
    • 提供数据冗余和负载均衡
节点角色

Elasticsearch节点可以承担一个或多个角色:

  1. 主节点(Master Node)

    • 管理集群范围的操作
    • 处理索引创建/删除
    • 节点添加/移除
    • 分片分配
  2. 数据节点(Data Node)

    • 存储数据
    • 执行数据相关操作(CRUD,搜索,聚合)
  3. 协调节点(Coordinating Node)

    • 接收客户端请求
    • 转发请求到相关节点
    • 汇总结果并返回给客户端
  4. 摄取节点(Ingest Node)

    • 预处理文档
    • 在索引前对文档进行转换
节点配置

elasticsearch.yml中配置节点角色:

# 主节点(不存储数据)
node.master: true
node.data: false
node.ingest: false

# 数据节点(不参与主节点选举)
node.master: false
node.data: true
node.ingest: false

# 协调节点(仅路由请求)
node.master: false
node.data: false
node.ingest: false

# 摄取节点
node.master: false
node.data: false
node.ingest: true

3.3 索引与文档

索引结构

索引(Index)是文档的集合,在物理上由一个或多个分片组成。

索引命名规则

  • 必须全部小写
  • 不能包含以下字符:\, /, *, ?, ", <, >, |, , ,, #
  • 不能以-, _, +开头
  • 不能是以下名称:...
索引设置

创建索引时的主要设置项:

{
  "settings": {
    "number_of_shards": 3,          // 主分片数量
    "number_of_replicas": 1,        // 每个主分片的副本数
    "refresh_interval": "1s",       // 刷新间隔
    "analysis": {                   // 分析器设置
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase"]
        }
      }
    }
  }
}
文档操作

文档(Document)是JSON格式的数据单元,每个文档必须有一个唯一的ID。

文档ID生成方式

  1. 自动生成(推荐):使用POST请求,由Elasticsearch生成
  2. 手动指定:使用PUT请求,明确指定ID

元数据字段

  • _index:文档所属索引
  • _id:文档唯一标识符
  • _version:文档版本号,用于乐观并发控制
  • _seq_no:序列号,递增值
  • _primary_term:主分片重新分配时递增的值

3.4 分片与副本

分片机制

分片(Shard)是Elasticsearch的核心分布式特性。

主要特点

  1. 每个分片是一个完整的Lucene索引
  2. 分片数在索引创建时确定,后续无法更改
  3. 分片可分布在集群中的多个节点上

分片类型

  1. 主分片(Primary Shard)

    • 存储索引数据的原始副本
    • 所有写操作先在主分片执行
    • 默认数量:1个(7.0以后)
  2. 副本分片(Replica Shard)

    • 主分片的复制品
    • 提供读取冗余或在主分片故障时提升为主分片
    • 默认数量:1个(即每个主分片有1个副本)
分片数量选择

分片数量的选择因素:

  1. 数据量:每个分片建议控制在20GB-40GB
  2. 节点数量:确保所有节点都有分片
  3. 查询性能:分片越多,单个查询需要协调的分片越多
  4. 硬件资源:节点的CPU和内存限制
分片分配

Elasticsearch自动管理分片分配:

  1. 新建索引:自动在节点间平衡分配分片
  2. 节点离线:自动将该节点上的主分片的副本提升为主分片
  3. 节点添加:自动将部分分片重新分配到新节点以平衡负载

3.5 映射与类型

映射(Mapping)定义了索引中的文档结构,类似关系数据库中的表结构。

映射类型
  1. 动态映射

    • Elasticsearch根据文档自动推断字段类型
    • 无需预先定义,适合快速开发
  2. 显式映射

    • 手动定义字段类型和特性
    • 提供更精确的控制,推荐生产环境使用
映射设置
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "standard"
      },
      "content": {
        "type": "text",
        "analyzer": "english"
      },
      "date": {
        "type": "date",
        "format": "yyyy-MM-dd"
      },
      "status": {
        "type": "keyword"
      },
      "price": {
        "type": "double"
      },
      "is_published": {
        "type": "boolean"
      }
    }
  }
}
字段参数

常用字段参数:

  1. analyzer:指定分析器
  2. search_analyzer:指定搜索时使用的分析器
  3. boost:字段权重
  4. coerce:是否尝试清理脏数据
  5. copy_to:将字段值复制到目标字段
  6. doc_values:是否启用列式存储
  7. dynamic:字段的动态映射策略
  8. eager_global_ordinals:是否预加载全局序号
  9. enabled:是否解析字段内容
  10. format:日期格式
  11. ignore_above:忽略超过指定长度的字符串
  12. ignore_malformed:忽略格式错误的值
  13. index:是否索引此字段
  14. index_options:索引控制参数
  15. fields:多字段参数,允许以不同方式索引同一字段
  16. norms:是否存储归一化因子
  17. null_value:NULL值的替代值
  18. position_increment_gap:多值字段中词条之间的位置增量
  19. store:是否单独存储字段值
  20. similarity:使用的相似度算法
  21. term_vector:是否存储词向量

3.6 分析器

分析器(Analyzer)负责将文本转换为词条(term),是全文搜索的核心组件。

分析器组成

分析器由三部分组成:

  1. 字符过滤器(Character Filters)

    • 对原始文本进行预处理
    • 例如:移除HTML标签、替换特定字符等
  2. 分词器(Tokenizer)

    • 将文本分割成词条
    • 例如:根据空格分词、根据语法规则分词等
  3. 词条过滤器(Token Filters)

    • 处理分词后的词条
    • 例如:转换为小写、删除停用词、添加同义词等
内置分析器

Elasticsearch提供多种内置分析器:

  1. Standard Analyzer

    • 默认分析器
    • 根据Unicode文本分割规则分词
    • 转换为小写
  2. Simple Analyzer

    • 按非字母字符分词
    • 转换为小写
  3. Whitespace Analyzer

    • 按空白字符分词
    • 不转换大小写
  4. Stop Analyzer

    • 与Simple Analyzer类似
    • 额外删除停用词
  5. Keyword Analyzer

    • 将整个字段作为一个词条
    • 不做任何处理
  6. Pattern Analyzer

    • 使用正则表达式分词
    • 默认按\W+(非字母数字)分割
  7. Language Analyzers

    • 针对特定语言的分析器
    • 例如:english、french、chinese等
自定义分析器
{
  "settings": {
    "analysis": {
      "char_filter": {
        "html_strip": {
          "type": "html_strip"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "standard"
        }
      },
      "filter": {
        "my_stopwords": {
          "type": "stop",
          "stopwords": ["the", "a", "is"]
        }
      },
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "char_filter": ["html_strip"],
          "tokenizer": "my_tokenizer",
          "filter": ["lowercase", "my_stopwords"]
        }
      }
    }
  }
}

3.7 数据类型

Elasticsearch支持多种数据类型:

核心类型
  1. 文本类型

    • text:全文索引的字符串字段
    • keyword:不分析的字符串字段,适合过滤、排序和聚合
  2. 数值类型

    • long:64位有符号整数
    • integer:32位有符号整数
    • short:16位有符号整数
    • byte:8位有符号整数
    • double:双精度64位IEEE 754浮点数
    • float:单精度32位IEEE 754浮点数
    • half_float:半精度16位IEEE 754浮点数
    • scaled_float:缩放类型的浮点数
  3. 日期类型

    • date:日期类型,支持多种格式
  4. 布尔类型

    • boolean:true/false值
  5. 二进制类型

    • binary:Base64编码的二进制数据
  6. 范围类型

    • integer_range:整数范围
    • float_range:浮点数范围
    • long_range:长整数范围
    • double_range:双精度浮点数范围
    • date_range:日期范围
    • ip_range:IP地址范围
复杂类型
  1. 数组类型

    • 任何字段都可以包含多个值(数组)
    • 数组中的所有值必须是同一类型
  2. 对象类型

    • object:单个JSON对象
  3. 嵌套类型

    • nested:对象数组,每个对象都能被独立索引和查询
特殊类型
  1. 地理类型

    • geo_point:经纬度坐标
    • geo_shape:复杂形状(如多边形)
  2. 专用类型

    • ip:IPv4或IPv6地址
    • completion:自动完成建议
    • token_count:分析后的词条数量
    • attachment:附件类型(需插件)
    • percolator:存储查询本身

4. REST API详解

4.1 基本格式

Elasticsearch提供RESTful API,遵循以下格式:

<HTTP方法> /<索引>/<类型>/<ID>

其中:

  • HTTP方法:GET, POST, PUT, DELETE等
  • 索引:操作的索引名
  • 类型:操作的类型(7.0版本后只有_doc或不指定)
  • ID:文档的唯一标识符

请求和响应主体使用JSON格式。

4.2 索引操作API

创建索引
PUT /my_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "content": { "type": "text" },
      "tags": { "type": "keyword" }
    }
  }
}
获取索引信息
GET /my_index
检查索引是否存在
HEAD /my_index
修改索引设置
PUT /my_index/_settings
{
  "index": {
    "number_of_replicas": 2
  }
}
更新映射
PUT /my_index/_mapping
{
  "properties": {
    "new_field": { "type": "keyword" }
  }
}
删除索引
DELETE /my_index
索引别名

创建别名:

POST /_aliases
{
  "actions": [
    { "add": { "index": "my_index", "alias": "my_alias" } }
  ]
}

修改别名:

POST /_aliases
{
  "actions": [
    { "remove": { "index": "my_index", "alias": "my_alias" } },
    { "add": { "index": "my_index_v2", "alias": "my_alias" } }
  ]
}

4.3 文档操作API

创建文档

指定ID:

PUT /my_index/_doc/1
{
  "title": "Elasticsearch Guide",
  "content": "A complete guide to Elasticsearch",
  "tags": ["search", "database"]
}

自动生成ID:

POST /my_index/_doc
{
  "title": "Elasticsearch Guide",
  "content": "A complete guide to Elasticsearch",
  "tags": ["search", "database"]
}
获取文档
GET /my_index/_doc/1

仅返回特定字段:

GET /my_index/_doc/1?_source=title,tags
检查文档是否存在
HEAD /my_index/_doc/1
更新文档

全量更新:

PUT /my_index/_doc/1
{
  "title": "Updated Elasticsearch Guide",
  "content": "An updated guide to Elasticsearch",
  "tags": ["search", "database", "guide"]
}

部分更新:

POST /my_index/_update/1
{
  "doc": {
    "title": "Updated Elasticsearch Guide"
  }
}

使用脚本更新:

POST /my_index/_update/1
{
  "script": {
    "source": "ctx._source.tags.add(params.new_tag)",
    "params": {
      "new_tag": "tutorial"
    }
  }
}
删除文档
DELETE /my_index/_doc/1

4.4 搜索API

基本搜索

搜索所有文档:

GET /my_index/_search

分页搜索:

GET /my_index/_search
{
  "from": 0,
  "size": 10
}
查询字符串搜索
GET /my_index/_search?q=title:elasticsearch
查询DSL搜索
GET /my_index/_search
{
  "query": {
    "match": {
      "title": "elasticsearch"
    }
  }
}
复合查询
GET /my_index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "elasticsearch" } }
      ],
      

网站公告

今日签到

点亮在社区的每一天
去签到