Elasticsearch 索引创建与文档管理

Elasticsearch 索引创建与文档管理

一、索引创建与配置

1.1 索引参数设置

在创建索引时,必须配置以下核心参数:

java 复制代码
PUT /book_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "analysis": {
      "analyzer": {
        "ik_analyzer": {
          "type": "ik_max_word"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": { "type": "text", "analyzer": "ik_analyzer" },
      "author": { "type": "keyword" },
      "content": { "type": "text", "analyzer": "ik_analyzer" }
    }
  }
}

1.2 分词器配置

  • IK 分词器 :支持中文分词,可配置为 ik_max_word(最大分词)或 ik_smart(最小分词)
  • 字段类型
    • text:全文本字段,支持分词搜索
    • keyword:精确匹配字段,用于聚合和排序
    • date:日期类型字段
    • numeric:数值类型字段

二、文档操作实践

2.1 单文档添加

java 复制代码
POST /book_index/_doc/1
{
  "title": "Elasticsearch实战",
  "author": "张三",
  "content": "本书系统讲解了Elasticsearch的核心概念..."
}

2.2 批量文档添加 (Bulk API)

java 复制代码
POST /_bulk
{
  "index": { "_index": "book_index", "_id": "1" }
  "document": {
    "title": "Elasticsearch实战",
    "author": "张三",
    "content": "本书系统讲解了Elasticsearch的核心概念..."
  }
}

2.3 文档删除

java 复制代码
DELETE /book_index/_doc/1

三、数据转换与处理

3.1 对象转JSON

使用 FastJSON 库进行对象转换:

java 复制代码
Book book = new Book();
book.setId(1);
book.setTitle("Elasticsearch实战");

String json = JSON.toJSONString(book);

3.2 数据查询

java 复制代码
GET /book_index/_search
{
  "query": {
    "match": {
      "content": "Elasticsearch"
    }
  },
  "size": 10
}

四、高级操作与优化

4.1 分页查询

java 复制代码
GET /book_index/_search
{
  "query": {
    "match_all": {}
  },
  "size": 10,
  "from": 0
}

4.2 性能优化建议

  1. 分页限制:默认分页大小为10,建议根据业务需求调整
  2. 字段筛选:仅返回需要的字段可减少网络传输
  3. 分词器选择:根据业务场景选择合适的分词策略
  4. 索引生命周期管理:定期清理过期数据

五、完整工作流示例

5.1 环境准备

xml 复制代码
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.83</version>
</dependency>

5.2 数据导入流程

  1. 查询数据库数据:
java 复制代码
List<Book> books = bookDao.selectAll();
  1. 构建Bulk请求:
java 复制代码
BulkRequest bulkRequest = new BulkRequest();
for (Book book : books) {
  bulkRequest.add(
    new IndexRequest("book_index")
      .id(String.valueOf(book.getId()))
      .source(JSON.toJSONString(book), StandardCharsets.UTF_8)
  );
}
  1. 执行批量导入:
java 复制代码
client.bulk(bulkRequest, RequestOptions.DEFAULT);

六、常见问题处理

6.1 分词器配置错误

  • 检查 settings.analysis.analyzer 配置
  • 确认字段类型是否匹配分词器要求

6.2 文档无法检索

  • 验证索引是否成功创建
  • 检查字段映射类型是否与查询条件匹配
  • 确认数据是否已成功写入

6.3 性能瓶颈处理

  • 增加分片数量(根据数据量)
  • 优化字段类型配置
  • 启用副本分片提高读取性能

七、附录

7.1 常用REST API

操作类型 请求方法 示例
创建索引 PUT PUT /book_index
添加文档 POST POST /book_index/_doc/1
查询数据 GET GET /book_index/_search
删除文档 DELETE DELETE /book_index/_doc/1

7.2 字段类型对照表

字段类型 说明 示例
text 全文搜索 "content": "..."
keyword 精确匹配 "author": "张三"
date 日期类型 "publish_date": "2023-01-01"
integer 整数类型 "page_count": 300
相关推荐
小猿姐2 小时前
唯品会大规模数据库云原生实践:基于 KubeBlocks 管理数千实例的统一运维之路
运维·elasticsearch·云原生
SelectDB11 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
ApacheSeaTunnel14 小时前
当多表数据涌入,Apache SeaTunnel 如何巧妙化解主键冲突?
大数据·开源·数据集成·seatunnel·技术分享·数据同步
Elasticsearch19 小时前
使用 Elastic Agent Builder 和 Sarvam AI 构建多语言语音 agent
elasticsearch
大大大大晴天3 天前
Hudi Metadata Table 与 Hive Sync (HMS)怎么选?
大数据
手可摘星辰7774 天前
一次线上FlinkCDC异常排查复盘
大数据·flink
大大大大晴天4 天前
Hudi技术内幕:Metadata Table原理与实践
大数据
武子康5 天前
调查研究-197 FAISS vs Elasticsearch 全面对比:从向量检索、全文搜索到 RAG 选型指南
人工智能·elasticsearch·agent
大大大大晴天5 天前
Hudi技术内幕:深入解析Index索引机制
大数据
阿里云大数据AI技术5 天前
Flink Forward Asia 2026 深圳启幕:Agentic Streaming for AI,开启实时智能新范式
大数据·flink