iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
1
Elastic Stack on Cloud

Elastic Stack武學練功坊系列 第 9 篇

Elastic Stack第九重

  • 分享至 

  • xImage
  •  

Searching Part III(搜尋)

從整個 Query DSL 看起
此篇的指令以 kibana 操作為主,個人覺得比較方便好用且易上手


Query DSL

看到這個詞一定納悶這到底是什麼東西?
其實,如果前幾篇有做過的話,我們已經使用過他了

[官方文件]
組成/定義 query 的JSNO的那些語法即為 Query DSL (Domain Specific Language)

把 Query DSL 想像成是 query 的 AST (Abstract Syntax Tree) ,包含兩種:

  • Leaf query clauses
  • Compound query clauses

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

Query and filter context

前幾篇介紹過 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 ,
例如:

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


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


Reference

query DSL
Query and filter context
Compound Queries


上一篇
Elastic Stack第八重
下一篇
Elastic Stack第十重
系列文
Elastic Stack武學練功坊 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
西撒
iT邦新手 4 級 ‧ 2020-12-11 13:52:55

很有用
原來是這樣分析 來組合 query json

我要留言

立即登入留言