iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
1
Elastic Stack on Cloud

Elastic Stack武學練功坊系列 第 21

Elastic Stack第二十一重

  • 分享至 

  • xImage
  •  

Query DSL Part II (查詢語法)

本篇繼續介紹 Query DSL的 Full text queries


本篇介紹以下 full text queries

  • match_phrase query
  • match_phrase_prefix query
  • multi_match query

match_phrase query
match 一樣,會對 query value做analyze後產生 analyzed text,
只是是透過 phrase query 匹配

直接用範例解釋

Request

GET /_search
{
  "query": {
    "match_phrase": { (1)
      "message": "this is a test" (2)
      }
    }
  }
}

此處使用的是在 match 有介紹過的縮寫寫法,即 <field>query的值(query value)結合

(1): 即為 match_phrase query
(2): "this is a test" 即為 query value

依照上述 Request ,只有當 documents的 message 的 field value中有包含 "this is a test"才會匹配得到

match_phrase_prefix query
會拆解成terms,最後一個term是用 prefix,其他是用 phrase ,且順序要一樣

GET /_search
{
  "query": {
    "match_phrase_prefix": {
      "message": {
        "query": "quick brown f"
      }
    }
  }
}

此 query value只會匹配,要有 quick brown 且 後面緊接著 f 開頭的字串

multi_match query
建立在 match query 之上,但允許指定多個 fields

直接用範例

GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "this is a test",  (1)
      "fields": [ "subject", "message" ] (2)
    }
  }
}

(1): query string
(2): 可指定多個fields

透過此request,可以用同一 query value在多個fields內搜尋,
以此為例,即用 match query 在 subject field 以及 message field 分別搜尋 this is a test

此外,還有提供彈性可以針對單一field設定boosting或wildcard,例如:

GET /_search
{
  "query": {
    "multi_match" : {
      "query" : "this is a test",
      "fields" : [ "subject^3", "message", "*_name"] 
    }
  }
}

subject field如匹配到計算分數會是 message 的三倍,
如有 last_namefirst_name,此query value也會在這兩個field 做 match query,
因為 *_name

multi_match query 有許多種不同的運作方式,可以透過 type 參數來設定,
預設為 best_fields

舉個例子

GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "brown fox",
      "type":       "best_fields",
      "fields":     [ "subject", "message" ],
      "tie_breaker": 0.3
    }
  }
}

上述可以被視為如下request

GET /_search
{
  "query": {
    "dis_max": {
      "queries": [
        { "match": { "subject": "brown fox" }},
        { "match": { "message": "brown fox" }}
      ],
      "tie_breaker": 0.3
    }
  }
}

也就是說, best_fields 會把產生的 match query包在 dis_max query 內
dis_max query又什麼呢?
documents只要有匹配到 dis_max.queries 下的一個 query clause,即會回傳,
但分數計算方式比較不同,是取 "所有匹配到的query clauses中最高分數的"
而如果有設定 tie_breaker (預設是 0.0 ,允許值為 01.0之間),
則 其他匹配到的query clause會乘以 tie_breaker,最後加上最高分數

簡而言之就是, matching query最高分 + (tie_breaker * 其他match query分數)

回歸正題,type 參數除了 best_fields 還有很多其他選擇

  • most_fields
  • cross_fields
  • phrase
  • phrase_prefix
  • bool_prefix

除了預設 best_fieldsphrase 我覺得用到的機率也算高,
其實差異只是差在 原本使用的 match query 改成 match_phrase query,
即為前面介紹的 phrase query,terms必須緊鄰才會匹配


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


Reference

Full text queries
Disjunction max query


上一篇
Elastic Stack第二十重
下一篇
Elastic Stack第二十二重
系列文
Elastic Stack武學練功坊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言