Bất kỳ trường đối tượng nào cũng có thể lấy một mảng đối tượng. Mỗi đối tượng trong mảng được ánh xạ động dưới dạng một loại trường đối tượng và được lưu trữ ở dạng phẳng. Điều này có nghĩa là các đối tượng trong mảng được chia thành các trường riêng lẻ và các giá trị cho từng trường trên tất cả các đối tượng được lưu trữ cùng nhau. Đôi khi cần phải sử dụng kiểu lồng nhau để giữ toàn bộ đối tượng lồng nhau để bạn có thể thực hiện tìm kiếm trên đó
dạng phẳng
Theo mặc định, mỗi đối tượng lồng nhau được ánh xạ động dưới dạng loại trường đối tượng. Bất kỳ trường đối tượng nào cũng có thể lấy một mảng đối tượng
PUT testindex1/_doc/100
{
"patients": [
{"name" : "John Doe", "age" : 56, "smoker" : true},
{"name" : "Mary Major", "age" : 85, "smoker" : false}
]
}
Khi các đối tượng này được lưu trữ, chúng sẽ được làm phẳng, do đó, sự biểu diễn bên trong của chúng có một mảng gồm tất cả các giá trị cho mỗi trường
{
"patients.name" : ["John Doe", "Mary Major"],
"patients.age" : [56, 85],
"smoker" : [true, false]
}
Một số truy vấn sẽ hoạt động chính xác trong đại diện này. Nếu bạn tìm kiếm bệnh nhân trên 75 tuổi HOẶC người hút thuốc, tài liệu 100 phải phù hợp
GET testindex1/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"patients.smoker": true
}
},
{
"range": {
"patients.age": {
"gte": 75
}
}
}
]
}
}
}
Truy vấn trả về chính xác tài liệu 100
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.3616575,
"hits" : [
{
"_index" : "testindex1",
"_type" : "_doc",
"_id" : "100",
"_score" : 1.3616575,
"_source" : {
"patients" : [
{
"name" : "John Doe",
"age" : "56",
"smoker" : true
},
{
"name" : "Mary Major",
"age" : "85",
"smoker" : false
}
]
}
}
]
}
}
Ngoài ra, nếu bạn tìm kiếm bệnh nhân trên 75 tuổi VÀ người hút thuốc, tài liệu 100 sẽ không khớp
GET testindex1/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"patients.smoker": true
}
},
{
"range": {
"patients.age": {
"gte": 75
}
}
}
]
}
}
}
Tuy nhiên, truy vấn này vẫn trả về tài liệu 100 không chính xác. Điều này là do mối quan hệ giữa tuổi và hút thuốc đã bị mất khi các mảng giá trị cho các trường riêng lẻ được tạo
Loại trường lồng nhau
Các đối tượng lồng nhau được lưu trữ dưới dạng các tài liệu riêng biệt và đối tượng cha có tham chiếu đến các phần tử con của nó. Để đánh dấu các đối tượng là lồng nhau, hãy tạo ánh xạ với loại trường lồng nhau
PUT testindex1
{
"mappings" : {
"properties": {
"patients": {
"type" : "nested"
}
}
}
}
Sau đó, lập chỉ mục tài liệu với loại trường lồng nhau
PUT testindex1/_doc/100
{
"patients": [
{"name" : "John Doe", "age" : 56, "smoker" : true},
{"name" : "Mary Major", "age" : 85, "smoker" : false}
]
}
Bây giờ nếu bạn chạy cùng một truy vấn để tìm kiếm bệnh nhân trên 75 tuổi VÀ người hút thuốc, không có kết quả nào được trả về, điều này đúng
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
}
}
Thông số
Bảng sau liệt kê các tham số được các loại trường đối tượng chấp nhận. Tất cả các tham số là tùy chọn
Tham sốDescription
{
"patients.name" : ["John Doe", "Mary Major"],
"patients.age" : [56, 85],
"smoker" : [true, false]
}
5Chỉ định liệu các trường mới có thể được thêm động vào đối tượng này hay không. Các giá trị hợp lệ là {
"patients.name" : ["John Doe", "Mary Major"],
"patients.age" : [56, 85],
"smoker" : [true, false]
}
6, {
"patients.name" : ["John Doe", "Mary Major"],
"patients.age" : [56, 85],
"smoker" : [true, false]
}
0 và {
"patients.name" : ["John Doe", "Mary Major"],
"patients.age" : [56, 85],
"smoker" : [true, false]
}
1. Mặc định là {
"patients.name" : ["John Doe", "Mary Major"],
"patients.age" : [56, 85],
"smoker" : [true, false]
}
6. {
"patients.name" : ["John Doe", "Mary Major"],
"patients.age" : [56, 85],
"smoker" : [true, false]
}
3Một giá trị Boolean xác định liệu tất cả các trường trong đối tượng lồng con cũng nên được thêm vào tài liệu gốc ở dạng phẳng hay không. Mặc định là {
"patients.name" : ["John Doe", "Mary Major"],
"patients.age" : [56, 85],
"smoker" : [true, false]
}
0. {
"patients.name" : ["John Doe", "Mary Major"],
"patients.age" : [56, 85],
"smoker" : [true, false]
}
5Một giá trị Boolean xác định xem có nên thêm tất cả các trường trong đối tượng lồng nhau vào tài liệu gốc ở dạng phẳng hay không. Mặc định là {
"patients.name" : ["John Doe", "Mary Major"],
"patients.age" : [56, 85],
"smoker" : [true, false]
}
0. {
"patients.name" : ["John Doe", "Mary Major"],
"patients.age" : [56, 85],
"smoker" : [true, false]
}
7Các trường của đối tượng này, có thể thuộc bất kỳ loại được hỗ trợ nào. Các thuộc tính mới có thể được thêm động vào đối tượng này nếu {
"patients.name" : ["John Doe", "Mary Major"],
"patients.age" : [56, 85],
"smoker" : [true, false]
}
5 được đặt thành {
"patients.name" : ["John Doe", "Mary Major"],
"patients.age" : [56, 85],
"smoker" : [true, false]
}
6