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
相关推荐
洛森唛1 小时前
ElasticSearch查询语句Query String详解:从入门到精通
后端·elasticsearch
字节跳动数据平台2 小时前
5000 字技术向拆解 | 火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
武子康8 小时前
大数据-239 离线数仓 - 广告业务实战:Flume 导入日志到 HDFS,并完成 Hive ODS/DWD 分层加载
大数据·后端·apache hive
洛森唛1 天前
Elasticsearch DSL 查询语法大全:从入门到精通
后端·elasticsearch
字节跳动数据平台1 天前
代码量减少 70%、GPU 利用率达 95%:火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
得物技术1 天前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark
武子康1 天前
大数据-238 离线数仓 - 广告业务 Hive分析实战:ADS 点击率、购买率与 Top100 排名避坑
大数据·后端·apache hive
武子康2 天前
大数据-237 离线数仓 - Hive 广告业务实战:ODS→DWD 事件解析、广告明细与转化分析落地
大数据·后端·apache hive
大大大大晴天2 天前
Flink生产问题排障-Kryo serializer scala extensions are not available
大数据·flink
Elasticsearch3 天前
如何使用 Agent Builder 排查 Kubernetes Pod 重启和 OOMKilled 事件
elasticsearch