如何高效利用Elasticsearch的nested类型处理复杂嵌套数据?
摘要:Elasticsearch嵌套类型nested使用指南 嵌套类型nested的特点 可以存储数组对象 每个对象独立存储为隐藏的子文档 嵌套类型nested和object类型的区别和应用场景 nested 每个对象独立存储为隐藏的子文档 适合
Elasticsearch嵌套类型nested使用指南
嵌套类型nested的特点
可以存储数组对象
每个对象独立存储为隐藏的子文档
嵌套类型nested和object类型的区别和应用场景
nested
每个对象独立存储为隐藏的子文档
适合存储数组
查询的时候有特定的语法 nested查询 且字段要用对象.字段名
性能略低 因为要维护子文档
object
扁平化存储,数组中的对象相同字段会合并成数组
适合存储单层的json对象
查询的时候指定对象.字段名称即可
查询性能高
嵌套类型nested如何使用
索引结构
"properties" : {
"create_time" : {
"format" : "yyyy-MM-dd HH:mm:ss Z||yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm:ss.SSS Z||yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd HH:mm:ss,SSS||yyyy/MM/dd HH:mm:ss||yyyy-MM-dd HH:mm:ss,SSS Z||yyyy/MM/dd HH:mm:ss,SSS Z||epoch_millis||yyyy-MM-dd",
"index" : true,
"type" : "date",
"doc_values" : true
},
"title" : {
"index" : true,
"type" : "text"
},
"users" : {
"type" : "nested",
"properties" : {
"sex" : {
"type" : "keyword"
},
"age" : {
"type" : "integer"
},
"username" : {
"type" : "keyword"
}
}
}
}
插入数据
POST cn_taoym_json_to_nested/_bulk
{"index":{}}
{"create_time":"2023-10-01 10:00:00","title":"第一条数据","users":[{"username":"user1","age":25,"sex":"male"}]}
{"index":{}}
{"create_time":"2023-10-02 14:30:00","title":"第二条数据","users":[{"username":"user2","age":30,"sex":"female"}]}
{"index":{}}
{"create_time":"2023-10-03 09:15:00","title":"第三条数据","users":[{"username":"user3","age":28,"sex":"male"},{"username":"user4","age":22,"sex":"female"}]}
{"index":{}}
{"create_time":"1696300800000","title":"第四条数据(时间戳格式)","users":[{"username":"user5","age":35,"sex":"male"}]}
{"index":{}}
{"create_time":"2023/10/05 16:45:00","title":"第五条数据(不同日期格式)","users":[{"username":"user6","age":27,"sex":"female"}]}
查询username为user3的数据
GET cn_taoym_json_to_nested/_search
{
"query": {
"nested": {
"path": "users",
"query": {
"term": {
"users.username": {
"value": "user3"
}
}
},
"inner_hits": {}
}
