本篇繼續介紹 Query DSL的 Full text queries
本篇介紹以下 full text queries
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_name
和 first_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
,允許值為 0
和1.0
之間),
則 其他匹配到的query clause會乘以 tie_breaker
,最後加上最高分數
簡而言之就是, matching query最高分 + (tie_breaker * 其他match query分數)
回歸正題,type
參數除了 best_fields
還有很多其他選擇
除了預設 best_fields
, phrase
我覺得用到的機率也算高,
其實差異只是差在 原本使用的 match
query 改成 match_phrase
query,
即為前面介紹的 phrase
query,terms必須緊鄰才會匹配
小小新手,如有理解錯誤或寫錯再請不吝提醒或糾正
Full text queries
Disjunction max query