Elasticsearch嵌套类型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": {}     }   } } 

结果集

{   "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里面存储的是原数据,里面自然包含所有数据的

发表评论

评论已关闭。

相关文章