從整個 Query DSL 看起
此篇的指令以 kibana 操作為主,個人覺得比較方便好用且易上手
看到這個詞一定納悶這到底是什麼東西?
其實,如果前幾篇有做過的話,我們已經使用過他了
[官方文件]
組成/定義 query 的JSNO的那些語法即為 Query DSL (Domain Specific Language)
把 Query DSL 想像成是 query 的 AST (Abstract Syntax Tree) ,包含兩種:
Leaf query clauses
對特定欄位搜尋特定的值,例如:match
, term
or range
queries,
例如:
{
"match": {
"age": "40"
}
}
即屬 leaf query clause
Compound query clauses
包覆其他 leaf queries 或 compound queries ,
有 bool query
, dis_max query
和 constant_score query
等等
以下用 bool query
為例:
"bool": {
"must": [
{
"match": {
"age": "40"
}
}
]
}
即屬 compound query clause
前幾篇介紹過 relevance score(相關分數) ,
現在更深入說明到底分數計算的緣由,
實際上 分數計算 和 query clause
置於哪種context有很大的關係
Query context
在 query context
中, query clause
運作的概念可以想像成,
"這筆document和這個query clause有多匹配"
除了決定是否匹配之外,此 query clause
是會計算 relevance score(相關分數) 的
當 query clause
被放置於 query
參數下 即為 Query context
,
例如:search API 的 query
參數
Filter context
在 filter context
中, query clause
運作的概念可以想像成,
"這筆document是否匹配這個query clause"
答案只會有 "Yes" 或 "No",無任何分數計算
舉幾個情境:
timestamp
時間是否在 2015 和 2016 範圍內?status
狀態是 "published"
"已發佈" 的嗎?es有個特性 -> 會自動cache經常被用到的 filters
,來增進效能
當 query clause
被放置於 filter
參數下 即為 Filter context
,
例如:
filter
或 must_not
參數 (上一重有提及此)filter
參數filter
參數query and filter context 範例
GET /_search
{
"query": { (1)
"bool": {
"must": [ (2)
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [ (3)
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
(1) 有上述提到 query
參數,所以是 query context
(2) must
下的兩個 match
clauses 在 query context 下,所以會計算分數
(3) 上述 filter context 的第一個例子即為此,所以這邊的 term
和 range
clauses 是在 filter context 下,只會過濾出哪些documents匹配,不會影響分數
官方提示(Tips)
思考哪些條件是希望影響分數的,此時把這些 query clauses 放置在 query context ,
其餘放到 filter context
小小新手,如有理解錯誤或寫錯再請不吝提醒或糾正
query DSL
Query and filter context
Compound Queries