iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 7
0
Elastic Stack on Cloud

Python&Elasticsearch 入門系列 第 7

IT鐵人第7天 認識Elasticsearch Mapping(2) object

上篇講了一些常見的資料類型,今天來講一些能夠進階應用的資料類型:object

在講今天的內容之前先來說說為什麼沒有都提到Array好了。
在Elasticsearch中,沒有專用的array數據類型,大部分的時候任何字段都可以包含零個或多個數據,例如:

{
    "number": 1
}
or
{
    "number": [1, 2, 3] #數組內所有的值type必須都要一樣
}

Object

前面講的資料類型都是只有一層的,如下

{
    "name": "王小明", #name底下就是直接對到王小明這個名字
    "age": 10,
}

如果今天想要把資料分層,簡單講就是你希望資料再多一層分類,或看下面的範例

{
    "student": {
        "name": "王小明",
        "age": 10,
    }
}

就像上面的範例那樣,希望在王小明這份資料上多一層表示他是“student”的層級,這時候就要用到object了,廢話不多說直接看mapping的格式

{
    "mappings": {
        "properties": {
            "student": {
                "properties": {
                    "name": {
                        "type": "text"
                    },
                    "age": {
                        "type": "integer"
                    }
                }
            }

        }
    }
}

其實很簡單,就是在student下再多一層properties,後面格式就跟上篇講得一模一樣

Nested

Nested是object list,那有object了為什麼還要Nested呢,前面不是有提到任何字段都可以以多值的方式儲存嗎,我們先講講object儲存在es裡的樣子
前面有提到Elasticsearch(後面簡稱es)是基於Lucene,而Lucene沒有內部對象的概念,所以es會把object對象攤平,再丟給Lucene,攤平是什麼意思呢,我們看看下面的例子
假設有一個object的對象長這樣

{
    "student": {
        "name": "王小明",
        "age": 10,
    }
}

在es裡面會變成這樣

{
    "student.name": "王小明",
    "student.age": 10
}

如果我們同時有多個object,像下面

{
    "students": [
        {
            "name": "王小明",
            "age": 10
        },
        {
            "name": "許小美",
            "age": 12
        }
    ]
}

在es裡面會變成這樣

{
    "student.name": ["王小明","許小美"],
    "student.age": [10,12]
}

如此一來資料會失去關聯性,這時候就需要Nested,Nested在es裡面是長這樣:

Nested 文檔1
{
    "student.name": ["王小明"],
    "student.age": [10]
}
Nested 文檔2
{
    "student.name": ["王小明"],
    "student.age": [10]
}

如此一來資料就不會失去關聯性
下面來看看Nested的mapping格式

{
     "mappings": {
         "properties": {
             "student": {
                 "type": "nested" 
             }
         }
     }
}

今天的object介紹就到這裡告一段落,下篇會告訴大家另一個進階應用的數據類型結構:parent-child


上一篇
IT鐵人第6天 認識Elasticsearch Mapping(1)
下一篇
IT鐵人第8天 Elasticsearch 認識Mapping(3) parent/child
系列文
Python&Elasticsearch 入門30

尚未有邦友留言

立即登入留言