今天我們來介紹另一種object type: Join type
Join type:
在同一個索引中,爲document彼此之間建立parent/child的關聯性
我們來建立一個示範的索引
PUT /test
{
"mappings": {
"properties": {
"student_id": {
"type": "keyword"
},
"content": {
"type": "text"
},
"join_field": {
"type": "join",
"relations": {
"question": "answer"
}
}
}
}
}
設置方式為
接著我們來創建屬於父元素的document:
PUT /test/_doc/1
{
"student_id": "1",
"content": "this is question 1",
"join_field": {
"name": "question"
}
}
子元素
PUT /test/_doc/3?routing=1
{
"student_id": "3",
"content": "question 1 answer is A",
"join_field": {
"name": "answer",
"parent": 1
}
}
這時候的情況如下:
實際情境:
假如我想找到id為1的question它底下的答案應該怎麼辦?
(看不懂沒關係,之後在搜尋部分會再提一次,這邊只是簡單讓我們透過實際的code看到真實結果)
GET /test/_search
{
"query": {
"parent_id": {
"type": "answer",
"id": 1
}
}
}
GET /test/_search
{
"query": {
"has_parent": {
"parent_type": "question",
"query": {
"match": {
"content": "question 1"
}
}
}
}
}
兩種找法都是可以找到答案,上面是如果我們知道父元素id的情形下,下面has parent的則是在不知道父元素的id時可以用的方法。
使用join type的限制:
而這樣的join關係是可以創立多層級的
示意圖如下:
設定就會如下
PUT /company
{
"mappings": {
"properties": {
"join_field": {
"type": "join",
"relations": {
"company": ["manager", "partner"],
"manager": "employee"
}
}
}
}
}
PUT /company/_doc/1
{
"name": "my_company",
"join_field": "company"
}
PUT /company/_doc/2?routing=1
{
"name": "CEO",
"join_field": {
"name": "manager",
"parent": 1
}
}
PUT /company/_doc/3?routing=1
{
"name": "engineer",
"join_field": {
"name": "employee",
"parent": 2
}
}
注意employee的routing要跟祖父元素的id一樣,但是parent一樣是父元素的id
那我們一起來比較一下這三種類型的object type
這邊就把object type都介紹完了~
剩下可能也很常用但是我沒打算特別介紹的就是date類型了吧,但是我覺得要使用時再看官方文檔就可以了~
明天就進入到動態映射(Dynamic mapping)!