上篇講了一些常見的資料類型,今天來講一些能夠進階應用的資料類型:object
在講今天的內容之前先來說說為什麼沒有都提到Array好了。
在Elasticsearch中,沒有專用的array數據類型,大部分的時候任何字段都可以包含零個或多個數據,例如:
{
"number": 1
}
or
{
"number": [1, 2, 3] #數組內所有的值type必須都要一樣
}
前面講的資料類型都是只有一層的,如下
{
"name": "王小明", #name底下就是直接對到王小明這個名字
"age": 10,
}
如果今天想要把資料分層,簡單講就是你希望資料再多一層分類,或看下面的範例
{
"student": {
"name": "王小明",
"age": 10,
}
}
就像上面的範例那樣,希望在王小明這份資料上多一層表示他是“student”的層級,這時候就要用到object了,廢話不多說直接看mapping的格式
{
"mappings": {
"properties": {
"student": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
}
}
}
其實很簡單,就是在student下再多一層properties,後面格式就跟上篇講得一模一樣
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