在有些狀況中,我們在一個document中需要再多存其他的json object
例如:
PUT /company/_doc/1
{ 
  "region": "TW",
  "manager": { 
    "age":     30,
    "name": { 
      "first": "David",
      "last":  "Smith"
    }
  }
}
在document中,manager這個欄位本身也是儲存json格式
這樣的欄位就是object type field
object type一般比較常用的有以下幾種:
object type:
"region":             "TW",
"manager.age":        30,
"manager.name.first": "David",
"manager.name.last":  "Smith"
那乍看之下是沒有問題,但是如果今天換成這樣呢?
POST /employee/_doc
{
  "name": "Peter",
  "skill": [
    {
      "category": "front-end",
      "level": 10,
      "description": "senior"
    },
    {
      "category": "back-end",
      "level": 1,
      "description": "junior"
    }
    ]
}
我們存了一個document,今天他有包含兩個欄位name與skill
其中skill欄位是一個object type field
並且其中包含了兩個inner object,那經過扁平化後會長這樣
"skill.category": ["front-end", "back-end"],
"skill.level": [10, 1],
"skill.description": ["senior", "junior"]
有發現問題了嗎?
如果沒有的話,我們可以使用以下搜尋字句去查找
GET /employee/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "skill.level": {
              "lte": 9
            }
          }
        },
        {
          "match": {
            "name": "Peter"
          }
        },
        {
          "match": {
            "skill.category.keyword": "front-end"
          }
        }
      ]
    }
  }
}
看不懂沒關係,大意上是:
那應該會找不到資料吧~因為Peter的front-end有10分
但是ES會找到該筆資料,現在知道原因了嗎?
因為扁平化而導致資料失去關聯性
而為了解決這樣的問題object中的nested type可以處理這樣的類型
nested type:
"type":  "nested"
在查詢時會再介紹有關nested type的部分,因為nested type需要使用不同的查詢方式~這邊有個觀念就好
明天會再介紹另一種object type: Join type