用 Elastic 搜尋的時候,一般我們是給條件讓 Elastic 搜尋符合的資料,例如你想找 20 ~ 25 歲的會員,但有另一種情境是相反過來的,假設會員有個資料是 “你願意跟幾歲之間的人交朋友?”,這通常是兩個欄位假設是 minAge & maxAge,所以就是輸入一個年紀,搜尋有在 minAge ~ maxAge 之間的會員資料。
實務上我碰到比較頭痛的是,這兩欄資料有可能為 0 或大小值相反的情況,這樣的狀況就不能用一般的 query 去找了,只能靠 script 囉,先來看看寫法,以 php 為例:
xxxxxxxxxx
$myScript = 'if(doc["minAge"].value > 0 && doc["maxAge"].value == 0) {doc["minAge"].value <= ' . $member['age'] .
'} else if (doc["minAge"].value == 0 && doc["maxAge"].value > 0) {doc["maxAge"].value <= ' . $member['age'] .
'} else {doc["minAge"].value <= ' . $member['age'] . ' && doc["maxAge"].value >= ' . $member['age'] . '}';
$query['must'][] = [
[
'exists' => [
'field' => 'minAge'
]
],
[
'exists' => [
'field' => 'maxAge'
]
]
];
$query['must'][] = [
'script' => [
'script' => [
'source' => $myScript
]
]
];
javascript 的範例
xxxxxxxxxx
GET /member/_search
{
"query": {
"bool": {
"must": [
{
"exists": {
"field": "minAge"
}
},
{
"exists": {
"field": "maxAge"
}
},
{
"script": {
"script": {
"source": "(doc['minAge'].value > 0 && doc['minAge'].value < 150) || (doc['minAge'].value > 0 && doc['maxAge'].value >= 100)"
}
}
}
]
}
},
"size": 20
}
這是一個範例,主要是描述怎麼用 script 達到我們想要的效果,應該很容易理解,如果有不同的情境,也可以調整 if 的判斷式內容喔!
發佈留言