iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 10
0

Searching Part IV(搜尋)

此篇會說明一些實際的應用情況及範例
此篇的指令以 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"
      }
    }
  ]
}

其中 sortage 反序排列,方便debug

Response
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"
      }
    }
  ]
}

其中 sortage 反序排列,方便debug

Response
response

眼尖就會發現,總數變多了(102->493)且有出現非32、33歲的人

此request轉換為布林運算即為: gender="F" AND (1=1 OR age=32 OR age=33)
轉譯成中文類似: "帳戶擁有者是女性,而年齡可以是32歲或33歲的人"


詳細介紹一下為什麼 Request 1Request 2 的差異和原因

在使用 bool query 時,有一個參數
minimum_should_match : 指定有多少個 should clauses 一定要匹配

預設值共有兩種

  • 1: bool query 有大於等於1個 should clauses,且沒有 mustfilter clauses
  • 0: 除了上面的情況皆為此值(0)

Request 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
response


小小新手,如有理解錯誤或寫錯再請不吝提醒或糾正


Reference

Boolean query minimum_should_match
Term query


上一篇
Elastic Stack第九重
下一篇
Elastic Stack第十一重
系列文
Elastic Stack武學練功坊30

尚未有邦友留言

立即登入留言