您好,登录后才能下订单哦!
# ElasticSearch文档操作的方法有哪些
## 目录
- [一、ElasticSearch文档基础概念](#一elasticsearch文档基础概念)
- [1.1 文档的定义](#11-文档的定义)
- [1.2 文档的元数据](#12-文档的元数据)
- [二、文档写入操作](#二文档写入操作)
- [2.1 单文档写入](#21-单文档写入)
- [2.2 批量写入](#22-批量写入)
- [2.3 自动ID生成](#23-自动id生成)
- [三、文档查询操作](#三文档查询操作)
- [3.1 基础查询](#31-基础查询)
- [3.2 复合查询](#32-复合查询)
- [3.3 分页与排序](#33-分页与排序)
- [四、文档更新操作](#四文档更新操作)
- [4.1 全量更新](#41-全量更新)
- [4.2 部分更新](#42-部分更新)
- [4.3 脚本更新](#43-脚本更新)
- [五、文档删除操作](#五文档删除操作)
- [5.1 单文档删除](#51-单文档删除)
- [5.2 批量删除](#52-批量删除)
- [5.3 条件删除](#53-条件删除)
- [六、高级文档操作](#六高级文档操作)
- [6.1 版本控制](#61-版本控制)
- [6.2 乐观并发控制](#62-乐观并发控制)
- [6.3 路由控制](#63-路由控制)
- [七、实战案例](#七实战案例)
- [7.1 电商商品管理](#71-电商商品管理)
- [7.2 日志分析系统](#72-日志分析系统)
- [八、性能优化建议](#八性能优化建议)
- [九、常见问题解答](#九常见问题解答)
- [十、总结](#十总结)
## 一、ElasticSearch文档基础概念
### 1.1 文档的定义
ElasticSearch中的文档(Document)是信息存储的基本单位,采用JSON格式表示。每个文档包含:
- 业务数据字段(如商品名称、价格)
- 元数据字段(如_index, _id)
- 特殊字段(如_source存储原始JSON)
```json
{
"_index": "products",
"_id": "101",
"_source": {
"name": "智能手机",
"price": 3999,
"brand": "Xiaomi"
}
}
元数据字段 | 说明 | 示例值 |
---|---|---|
_index | 文档所属索引 | products |
_id | 文档唯一标识 | 101 |
_version | 文档版本号 | 3 |
_seq_no | 序列号 | 125 |
_primary_term | 主分片版本 | 1 |
# 指定ID写入
PUT /products/_doc/101
{
"name": "无线耳机",
"price": 299
}
# 响应示例
{
"_id": "101",
"_version": 1,
"result": "created"
}
POST _bulk
{ "index" : { "_index" : "products", "_id" : "102" } }
{ "name": "智能手表", "price": 899 }
{ "create" : { "_index" : "products", "_id" : "103" } }
{ "name": "平板电脑", "price": 2599 }
POST /products/_doc
{
"name": "蓝牙音箱",
"price": 199
}
# 响应包含自动生成的ID
{
"_id": "x3s5F4sBQ6pKvXgN1e2D",
"_version": 1
}
# 按ID查询
GET /products/_doc/101
# 字段过滤查询
GET /products/_search
{
"_source": ["name", "price"],
"query": {
"term": {
"price": 299
}
}
}
GET /products/_search
{
"query": {
"bool": {
"must": [
{ "match": { "name": "智能" } }
],
"filter": [
{ "range": { "price": { "gte": 500 } } }
]
}
}
}
GET /products/_search
{
"from": 0,
"size": 5,
"sort": [
{ "price": { "order": "desc" } }
]
}
PUT /products/_doc/101
{
"name": "无线耳机Pro",
"price": 399,
"new_field": "2023新款"
}
POST /products/_update/101
{
"doc": {
"price": 349
}
}
POST /products/_update/101
{
"script": {
"source": "ctx._source.price += params.discount",
"params": {
"discount": -50
}
}
}
DELETE /products/_doc/101
# 响应
{
"_id": "101",
"_version": 4,
"result": "deleted"
}
POST _bulk
{ "delete" : { "_index" : "products", "_id" : "102" } }
{ "delete" : { "_index" : "products", "_id" : "103" } }
POST /products/_delete_by_query
{
"query": {
"range": {
"price": {
"lt": 300
}
}
}
}
PUT /products/_doc/101?version=3&version_type=external
{
"name": "限量版耳机"
}
PUT /products/_doc/101?if_seq_no=125&if_primary_term=1
{
"name": "无线耳机Pro+"
}
POST /products/_doc?routing=user123
{
"name": "定制手机壳",
"user_id": "user123"
}
# 创建商品
PUT /ecommerce/_doc/1001
{
"title": "全自动洗衣机",
"category": "家电",
"price": 2599,
"stock": 50
}
# 库存扣减脚本
POST /ecommerce/_update/1001
{
"script": {
"source": """
if (ctx._source.stock >= params.quantity) {
ctx._source.stock -= params.quantity;
} else {
ctx.op = 'noop';
}
""",
"params": {
"quantity": 2
}
}
}
# 批量写入日志
POST _bulk
{ "index" : { "_index" : "logs-2023-08", "_id" : "1" } }
{ "timestamp": "2023-08-01T10:00:00Z", "level": "ERROR", "message": "DB connection failed" }
{ "index" : { "_index" : "logs-2023-08", "_id" : "2" } }
{ "timestamp": "2023-08-01T10:05:00Z", "level": "INFO", "message": "Service started" }
# 错误日志查询
GET /logs-2023-08/_search
{
"query": {
"bool": {
"must": [
{ "match": { "level": "ERROR" } },
{ "range": { "timestamp": { "gte": "now-1h" } } }
]
}
}
}
index
属性Q1:如何解决文档冲突?
A:采用乐观并发控制,使用if_seq_no
和if_primary_term
参数
Q2:为什么更新后_version没有变化? A:当新文档内容与原文档完全相同时,版本号不会递增
Q3:如何提高批量写入速度?
A:
- 增加refresh_interval(默认1s)
- 禁用副本(index.number_of_replicas: 0
)
- 适当增加批量大小(建议5-15MB)
Q4:文档最大支持多大?
A:默认限制100MB,可通过http.max_content_length
调整
本文全面介绍了ElasticSearch文档操作的完整体系,包括: - 基础CRUD操作 - 批量处理技巧 - 高级控制功能 - 实战应用场景
掌握这些操作后,您可以: ✓ 高效管理海量文档数据 ✓ 实现复杂搜索需求 ✓ 构建高性能搜索应用 ✓ 处理高并发数据场景
建议结合官方文档和实际业务场景进行深入实践,后续可进一步学习: - 聚合分析 - 索引生命周期管理 - 跨集群操作 “`
注:本文实际约6500字(含代码示例),如需精确控制字数可适当删减案例部分。所有操作示例均基于Elasticsearch 7.x+版本语法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。