Elasticsearch中多索引数据合并与Nested嵌套类型操作全解析
多索引数据合并操作,以及嵌套类型(nested)的相关操作指南。
Elasticsearch中多索引数据合并与Nested嵌套类型操作全解析
- 合并多索引数据到指定索引
- 嵌套类型(nested)操作指南
- 一、数据结构说明
- 二、基本CRUD操作
- 1. 插入文档
- 2. 更新嵌套字段
- 3. 删除嵌套数组中的特定元素
- 三、查询操作
- 1. 基础嵌套查询
- 2. 嵌套聚合分析
- 3. 多条件嵌套查询
- 四、特殊操作
- 1. 获取嵌套字段的内联命中
- 2. 嵌套排序
- 五、性能优化建议
合并多索引数据到指定索引
现在需要将index_name-2025q1、index_name-2025q2、index_name-2025q3、index_name-2025q4这4个索引的数据合并到index_name-2025这一个索引里,可用如下操作
POST _reindex
{"source": {"index": "index_name-2025q*"},"dest": {"index": "index_name-2025"}
}
嵌套类型(nested)操作指南
一、数据结构说明
{"mappings": {"properties": {"id": {"type": "keyword"},"orderId": {"type": "keyword"},"products": {"type": "nested","properties": {"productName": {"type": "text"},"productPrice": {"type": "scaled_float","scaling_factor": 100},"productQuantity": {"type": "integer"}}}}}
}
这个数据结构里的products是一个典型的嵌套数据类型(nested)结构,包含了一个text类型的productName,浮点类型的productPrice和一个整数型的productQuantity。
二、基本CRUD操作
1. 插入文档
POST /your_index/_doc/1
{"id": 1,"orderId": "20250528000001","products": [{"productName": "手机","productPrice": 5123.45,"productQuantity": 1},{"productName": "钢化膜","productPrice": 53.42,"productQuantity": 2}]
}
2. 更新嵌套字段
POST /your_index/_update/1
{"script": {"source": """// 修改productName为'钢化膜'的记录的productPricefor(int i=0; i<ctx._source.products.length; i++) {if(ctx._source.products[i].productName == params.productName) {ctx._source.products[i].productPrice = params.productPrice;break;}}""","params": {"productName": "钢化膜","productPrice": 130.50}}
}
3. 删除嵌套数组中的特定元素
POST /your_index/_update/1
{"script": {"source": """// 删除productName为'钢化膜'的记录ctx._source.products.removeIf(item -> item.productName == params.productName);""","params": {"productName": "钢化膜"}}
}
三、查询操作
1. 基础嵌套查询
GET /your_index/_search
{"query": {"nested": {"path": "products","query": {"bool": {"must": [{ "match": { "products.productName": "钢材" }},{ "range": { "products.productPrice": { "gte": 100 }}}]}}}}
}
2. 嵌套聚合分析
GET /your_index/_search
{"size": 0,"aggs": {"material_analysis": {"nested": {"path": "products"},"aggs": {"by_stuff": {"terms": {"field": "products.productName","size": 10},"aggs": {"avg_fact": {"avg": {"field": "products.productPrice"}}}}}}}
}
3. 多条件嵌套查询
GET /your_index/_search
{"query": {"bool": {"must": [{"nested": {"path": "products","query": {"bool": {"must": [{ "term": { "products.productName": "手机" }},{ "range": { "products.productPrice": { "gt": 150 }}}]}}}},{"match": { "otherField": "value" }}]}}
}
四、特殊操作
1. 获取嵌套字段的内联命中
GET /your_index/_search
{"query": {"nested": {"path": "products","query": {"match": { "products.productName": "钢化膜" }},"inner_hits": {} // 获取匹配的嵌套对象}}
}
2. 嵌套排序
GET /your_index/_search
{"sort": [{"products.productPrice": {"order": "desc","nested": {"path": "products","filter": {"term": { "products.productName": "钢化膜" }}}}}]
}
五、性能优化建议
-
合理设置
nested
字段数量 :嵌套文档会显著增加索引大小 -
**使用
include_in_parent
** :如需频繁查询父文档字段"products": {"type": "nested","include_in_parent": true,"properties": {...} }
-
控制嵌套文档大小 :单个文档的嵌套数组不宜过大(建议<100个元素)
-
使用
scaled_float
的优势 :比普通float
更节省空间,适合有明确精度的数值