iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
1
Elastic Stack on Cloud

Elastic Stack武學練功坊系列 第 9

Elastic Stack第九重

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 queriescompound queries
bool query, dis_max queryconstant_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 的第一個例子即為此,所以這邊的 termrange 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邦新手 5 級 ‧ 2020-12-11 13:52:55

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

我要留言

立即登入留言