找回密码
 立即注册
首页 业界区 业界 Elasticsearch嵌套类型nested使用指南

Elasticsearch嵌套类型nested使用指南

莠畅缕 2025-8-14 16:08:44
Elasticsearch嵌套类型nested使用指南

嵌套类型nested的特点


  • 可以存储数组对象
  • 每个对象独立存储为隐藏的子文档
嵌套类型nested和object类型的区别和应用场景


  • nested

    • 每个对象独立存储为隐藏的子文档
    • 适合存储数组
    • 查询的时候有特定的语法 nested查询 且字段要用对象.字段名
    • 性能略低 因为要维护子文档

  • object

    • 扁平化存储,数组中的对象相同字段会合并成数组
    • 适合存储单层的json对象
    • 查询的时候指定对象.字段名称即可
    • 查询性能高

嵌套类型nested如何使用

索引结构
  1. "properties" : {
  2.        "create_time" : {
  3.          "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",
  4.          "index" : true,
  5.          "type" : "date",
  6.          "doc_values" : true
  7.        },
  8.        "title" : {
  9.          "index" : true,
  10.          "type" : "text"
  11.        },
  12.        "users" : {
  13.          "type" : "nested",
  14.          "properties" : {
  15.            "sex" : {
  16.              "type" : "keyword"
  17.            },
  18.            "age" : {
  19.              "type" : "integer"
  20.            },
  21.            "username" : {
  22.              "type" : "keyword"
  23.            }
  24.          }
  25.        }
  26.      }
复制代码
插入数据
  1. POST cn_taoym_json_to_nested/_bulk
  2. {"index":{}}
  3. {"create_time":"2023-10-01 10:00:00","title":"第一条数据","users":[{"username":"user1","age":25,"sex":"male"}]}
  4. {"index":{}}
  5. {"create_time":"2023-10-02 14:30:00","title":"第二条数据","users":[{"username":"user2","age":30,"sex":"female"}]}
  6. {"index":{}}
  7. {"create_time":"2023-10-03 09:15:00","title":"第三条数据","users":[{"username":"user3","age":28,"sex":"male"},{"username":"user4","age":22,"sex":"female"}]}
  8. {"index":{}}
  9. {"create_time":"1696300800000","title":"第四条数据(时间戳格式)","users":[{"username":"user5","age":35,"sex":"male"}]}
  10. {"index":{}}
  11. {"create_time":"2023/10/05 16:45:00","title":"第五条数据(不同日期格式)","users":[{"username":"user6","age":27,"sex":"female"}]}
复制代码
查询username为user3的数据
  1. GET cn_taoym_json_to_nested/_search
  2. {
  3.   "query": {
  4.     "nested": {
  5.       "path": "users",
  6.       "query": {
  7.         "term": {
  8.           "users.username": {
  9.             "value": "user3"
  10.           }
  11.         }
  12.       },
  13.       "inner_hits": {}
  14.     }
  15.   }
  16. }
复制代码
结果集
  1. {
  2.   "took" : 2,
  3.   "timed_out" : false,
  4.   "_shards" : {
  5.     "total" : 4,
  6.     "successful" : 4,
  7.     "skipped" : 0,
  8.     "failed" : 0
  9.   },
  10.   "hits" : {
  11.     "total" : 1,
  12.     "max_score" : 0.9808291,
  13.     "hits" : [ {
  14.       "_index" : "cn_taoym_json_to_nested",
  15.       "_type" : "_doc",
  16.       "_id" : "EKfHp5gBCQbF-O0GPRhA",
  17.       "_score" : 0.9808291,
  18.       "_source" : {
  19.         "create_time" : "2023-10-03 09:15:00",
  20.         "title" : "第三条数据",
  21.         "users" : [ {
  22.           "sex" : "male",
  23.           "age" : 28,
  24.           "username" : "user3"
  25.         }, {
  26.           "sex" : "female",
  27.           "age" : 22,
  28.           "username" : "user4"
  29.         } ]
  30.       },
  31.       "inner_hits" : {
  32.         "users" : {
  33.           "hits" : {
  34.             "hits" : [ {
  35.               "_index" : "cn_taoym_json_to_nested",
  36.               "_type" : "_doc",
  37.               "_source" : {
  38.                 "sex" : "male",
  39.                 "age" : 28,
  40.                 "username" : "user3"
  41.               },
  42.               "_id" : "EKfHp5gBCQbF-O0GPRhA",
  43.               "_nested" : {
  44.                 "field" : "users",
  45.                 "offset" : 0
  46.               },
  47.               "_score" : 0.9808291
  48.             } ],
  49.             "total" : 1,
  50.             "max_score" : 0.9808291
  51.           }
  52.         }
  53.       }
  54.     } ]
  55.   }
  56. }
复制代码
"inner_hits": {}的作用是将嵌套查询中复合预期的数据单独收集起来。source里面存储的是原数据,里面自然包含所有数据的

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册