此篇會說明一些實際的應用情況及範例
此篇的指令以 kibana 操作為主,個人覺得比較方便好用且易上手
前置作業
後續範例皆使用 Elastic Stack第七重 匯入的範例資料,所以還未匯入可以先照那一重做批次匯入
bool query 中的 should
為什麼我會特別拿should來說明呢?
因為他有點特別,如果沒注意真的會誤用
有人可能第一眼看到
should
就直接把他和or
聯想 (還是只有我這樣覺得...
不過用起來可能會有些許差異,有些小細節要注意
不多說還是直接用範例幫助理解
Request 1
POST /bank/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"age": 32
}
},
{
"match": {
"age": 33
}
}
]
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
其中 sort
用 age
反序排列,方便debug
Response
轉換為布林運算即為: age=32 OR age=33
很簡單也很直覺,轉譯成中文類似: "帳戶擁有者是32歲或33歲的人"
Request 2
POST /bank/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"age": 32
}
},
{
"match": {
"age": 33
}
}
],
"filter": [
{
"term": {
"gender.keyword": "F"
}
}
]
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
其中 sort
用 age
反序排列,方便debug
Response
眼尖就會發現,總數變多了(102->493)且有出現非32、33歲的人
此request轉換為布林運算即為: gender="F" AND (1=1 OR age=32 OR age=33)
轉譯成中文類似: "帳戶擁有者是女性,而年齡可以是32歲或33歲的人"
詳細介紹一下為什麼 Request 1 和 Request 2 的差異和原因
在使用 bool query 時,有一個參數minimum_should_match
: 指定有多少個 should
clauses 一定要匹配
預設值共有兩種
should
clauses,且沒有 must
和 filter
clausesRequest 1 -> minimum_should_match
此時為1,所以會是至少一個 should
clauses 要匹配
Request 2 -> minimum_should_match
此時為0,所以 should
clauses 可以不用匹配到
那如果真的有情境是要 "帳戶擁有者是女性且年齡是32歲或33歲的人"
布林運算即為: gender="F" AND (age=32 OR age=33)
Request 3
POST /bank/_search
{
"query": {
"bool": { (2)
"must": [ (3)
{
"bool": { (1)
"should": [
{
"match": {
"age": 32
}
},
{
"match": {
"age": 33
}
}
]
}
}
],
"filter": [
{
"term": {
"gender.keyword": "F" (4)
}
}
]
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
(1): 此時 bool clause 的 minimum_should_match
為1,所以documents要符合32歲或33歲
(2): 此為 compound query clause
,上一重提及過,是可以包覆 compound queries,所以(2)包了(1)
(3): must
內是一定要匹配的,所以(1)這條件一定要匹配
(4): 這邊的 gender.keyword
為什麼後面有 keyword
,簡單說明一下,term query
只能用來找 精確值(exact term) ,後續篇章會介紹到,有興趣可以先參考reference內連結
Response
小小新手,如有理解錯誤或寫錯再請不吝提醒或糾正
Boolean query minimum_should_match
Term query