
# Elasticsearch 详细使用教程
## 一、Elasticsearch 简介和核心概念
**Elasticsearch** 是一个基于 **Lucene** 构建的分布式、RESTful 风格的搜索和数据分析引擎。它能让你高效地实现**全文检索**、**数据分析**和**日志管理**。
### 核心概念
| 概念 | 说明 | 对应关系 |
|——|——|———-|
| **索引 (Index)** | 文档的集合 | 数据库 (Database) |
| **文档 (Document)** | 基本数据单元,JSON 格式 | 表记录 (Row) |
| **字段 (Field)** | 文档中的属性 | 列 (Column) |
| **分片 (Shard)** | 索引的分布式分割 | – |
| **节点 (Node)** | 集群中的单个服务器 | – |
## 二、快速入门
### 安装配置
**Docker 快速部署:**
“`bash
# 启动单机版 Elasticsearch
docker run -d \
–name elasticsearch \
-p 9200:9200 \
-p 9300:9300 \
-e “discovery.type=single-node” \
-e “xpack.security.enabled=false” \
docker.elastic.co/elasticsearch/elasticsearch:8.11.0
“`
### 验证安装
“`bash
# 测试连接
curl http://localhost:9200
# 返回示例
{
“name”: “es-node-1”,
“cluster_name”: “docker-cluster”,
“version”: {
“number”: “8.11.0”,
“build_flavor”: “default”
},
“status”: “green”
}
“`
### 基础查询
“`bash
# 获取所有数据
GET /products/_search
# 条件查询
GET /products/_search
{
“query”: {
“term”: {
“category”: “electronics”
}
}
}
“`
## 三、索引管理
### 创建索引
“`bash
# 创建带映射的索引
PUT /products
{
“settings”: {
“number_of_shards”: 3,
“number_of_replicas”: 1
},
“mappings”: {
“properties”: {
“title”: {
“type”: “text”,
“analyzer”: “ik_max_word”
},
“price”: {
“type”: “float”
},
“category”: {
“type”: “keyword”
},
“stock”: {
“type”: “integer”
},
“created_at”: {
“type”: “date”
}
}
}
}
“`
### 索引配置说明
| 配置项 | 说明 | 建议值 |
|——–|——|——–|
| `number_of_shards` | 主分片数 | 1-5 |
| `number_of_replicas` | 副本数 | 0-2 |
| `refresh_interval` | 刷新间隔 | 1s-30s |
### 索引管理命令
“`bash
# 查看索引
GET /_cat/indices?v
# 删除索引
DELETE /products-old
# 更新索引设置
PUT /products/_settings
{
“index”: {
“refresh_interval”: “5s”
}
}
# 复制索引
POST /_aliases
{
“actions”: [
{
“add”: {
“index”: “products-2024”,
“alias”: “products”
}
}
]
}
“`
## 四、数据操作
### 创建文档
“`bash
# 自动分配 ID
POST /products/_doc
{
“title”: “Java 编程思想”,
“price”: 128.5,
“category”: “programming”,
“stock”: 100,
“created_at”: “2024-01-01T10:00:00Z”
}
# 指定 ID
PUT /products/_doc/1
{
“title”: “Java 编程思想”,
“price”: 128.5,
“category”: “programming”,
“stock”: 100
}
“`
### 读取文档
“`bash
# 获取单个文档
GET /products/_doc/1
# 批量获取
GET /products/_mget
{
“ids”: [“1”, “2”, “3”]
}
# 只获取指定字段
GET /products/_doc/1?_source=title,price
“`
### 更新文档
“`bash
# 部分更新
POST /products/_doc/1/_update
{
“doc”: {
“price”: 99.5,
“stock”: 80
}
}
# 使用脚本更新
POST /products/_doc/1/_update
{
“script”: {
“source”: “ctx._source.stock -= params.quantity”,
“params”: {
“quantity”: 10
}
}
}
“`
### 删除文档
“`bash
# 删除单个文档
DELETE /products/_doc/1
# 批量删除
DELETE /products/_delete_by_query
{
“query”: {
“term”: {
“category”: “temp”
}
}
}
# 删除所有文档
DELETE /products/_all
“`
## 五、搜索技巧
### 全文检索
“`bash
# 多字段搜索
GET /products/_search
{
“query”: {
“multi_match”: {
“query”: “Java 编程教程”,
“fields”: [“title”, “description”]
}
}
}
# 精确短语搜索
GET /products/_search
{
“query”: {
“match_phrase”: {
“title”: “Java 编程思想”
}
}
}
“`
### 模糊搜索
“`bash
# 模糊匹配
GET /products/_search
{
“query”: {
“match”: {
“title”: “jva”
}
}
}
# 自定义模糊度
GET /products/_search
{
“query”: {
“match”: {
“title”: {
“query”: “jav”,
“fuzziness”: “AUTO”
}
}
}
}
“`
### 布尔查询
“`bash
# 组合查询条件
GET /products/_search
{
“query”: {
“bool”: {
“must”: [
{ “term”: { “category”: “programming” } }
],
“filter”: [
{ “range”: { “price”: { “gte”: 50, “lte”: 200 } } }
],
“should”: [
{ “match”: { “title”: “Java” } }
],
“must_not”: [
{ “term”: { “status”: “deleted” } }
]
}
}
}
“`
### 分页和排序
“`bash
GET /products/_search
{
“query”: {
“match_all”: {}
},
“from”: 0,
“size”: 20,
“sort”: [
{ “price”: { “order”: “asc” } },
{ “created_at”: { “order”: “desc” } }
]
}
“`
### 聚合分析
“`bash
# 分类统计
GET /products/_search
{
“size”: 0,
“aggs”: {
“categories”: {
“terms”: {
“field”: “category”,
“size”: 10
}
}
}
}
# 平均价格
GET /products/_search
{
“size”: 0,
“aggs”: {
“avg_price”: {
“avg”: {
“field”: “price”
}
},
“total_stock”: {
“sum”: {
“field”: “stock”
}
}
}
}
# 范围统计
GET /products/_search
{
“size”: 0,
“aggs”: {
“price_ranges”: {
“range”: {
“field”: “price”,
“ranges”: [
{ “to”: 50, “key”: “low” },
{ “from”: 50, “to”: 200, “key”: “mid” },
{ “from”: 200, “key”: “high” }
]
}
}
}
}
“`
## 六、性能优化建议
### 索引优化
“`bash
# 合理的分片配置
PUT /products
{
“settings”: {
“number_of_shards”: 3,
“number_of_replicas”: 1,
“index.refresh_interval”: “5s”
}
}
# 使用 keyword 类型存储精确值
“category”: {
“type”: “keyword”
}
“`
### 查询优化
“`bash
# 使用 filter 代替 must(不计分)
GET /products/_search
{
“query”: {
“bool”: {
“must”: [
{ “match”: { “title”: “Java” } }
],
“filter”: [
{ “range”: { “price”: { “gte”: 50 } } }
]
}
}
}
“`
### 批量操作
“`bash
# 批量索引
POST /_bulk
{ “index”: { “_index”: “products”, “_id”: “1” } }
{ “title”: “商品 1”, “price”: 100 }
{ “index”: { “_index”: “products”, “_id”: “2” } }
{ “title”: “商品 2”, “price”: 200 }
“`
## 七、最佳实践
### 1. 命名规范
“`bash
# 使用小写字母
/products # ✓
/Products # ✗
# 添加日期前缀(日志场景)
/logs-2024.01.01 # ✓
“`
### 2. 字段类型选择
| 数据类型 | 适用场景 |
|———-|———-|
| `text` | 需要分词的文本 |
| `keyword` | 精确匹配、排序 |
| `integer` / `float` | 数值类型 |
| `date` | 时间戳 |
| `boolean` | 布尔值 |
### 3. 避免的问题
– ❌ 不要在索引创建后修改映射
– ❌ 不要使用深分页(使用 search_after)
– ❌ 不要在大规模数据上执行复杂聚合
– ✅ 使用别名管理索引版本
“`bash
# 使用别名切换版本
POST /_aliases
{
“actions”: [
{ “remove”: { “index”: “products-2024”, “alias”: “products” } },
{ “add”: { “index”: “products-2024-v2”, “alias”: “products” } }
]
}
“`
—
## 总结
本文涵盖了 Elasticsearch 的:
– ✅ **核心概念** – 索引、文档、分片、节点
– ✅ **快速入门** – 安装、配置、基础查询
– ✅ **索引管理** – 创建、配置、映射
– ✅ **数据操作** – CRUD 操作
– ✅ **搜索技巧** – 全文检索、模糊搜索、聚合分析
– ✅ **性能优化** – 索引、查询、批量操作优化
– ✅ **最佳实践** – 命名规范、字段类型、常见错误
#Elasticsearch #搜索引擎 #Java #大数据分析 #分布式搜索 #Lucene
—
**文章已完成!**
**文件路径:** `/home/node/.openclaw/agents/creator/workspace/content/Elasticsearch 使用教程_20260425_0701.md`
请告诉我下一步操作(配图、发布等)!





















暂无评论内容