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": {} } } }
结果集
{ "took" : 2, "timed_out" : false, "_shards" : { "total" : 4, "successful" : 4, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.9808291, "hits" : [ { "_index" : "cn_taoym_json_to_nested", "_type" : "_doc", "_id" : "EKfHp5gBCQbF-O0GPRhA", "_score" : 0.9808291, "_source" : { "create_time" : "2023-10-03 09:15:00", "title" : "第三条数据", "users" : [ { "sex" : "male", "age" : 28, "username" : "user3" }, { "sex" : "female", "age" : 22, "username" : "user4" } ] }, "inner_hits" : { "users" : { "hits" : { "hits" : [ { "_index" : "cn_taoym_json_to_nested", "_type" : "_doc", "_source" : { "sex" : "male", "age" : 28, "username" : "user3" }, "_id" : "EKfHp5gBCQbF-O0GPRhA", "_nested" : { "field" : "users", "offset" : 0 }, "_score" : 0.9808291 } ], "total" : 1, "max_score" : 0.9808291 } } } } ] } }
"inner_hits": {}的作用是将嵌套查询中复合预期的数据单独收集起来。source里面存储的是原数据,里面自然包含所有数据的