[ Elasticsearch ] Query DSL 緩慢更新中..


Query and filter context

Elasticsearch 提供一個以JSON定義查詢式Query DSL
你可以將Query DSL想成是一個AST (abstract syntax tree) queries
Query DSL 由兩種型態的查詢子句所組成

  • Leaf 查詢子句
    • 用來查詢某個欄位的某個特定值
    • 例如:  match, term 或 range
  • Compound 查詢子句
Query的行為視此Query使用的是query context或著是filter context

  • Query context
    • 傾向於更準確的搜尋
    • 此query子句會產生 _score 來顯示match
  • Filter context
    • 比較像是全文搜索
    • 比較像是回答 "這個文件是否符合此query子句"
    • 常被用來過濾結構化的資料
      • 例如: 這個文件的狀態是否被設定成已發布
    • 常用filter搜尋的資料會自動被cache起來用以加速
    • Reference: 對岸好文
下列的例子在search api中使用了query與filter context
此query將會符合以下的條件
  • title 欄位包含search這個字串
  • content 欄位包含elasticsearch這個字串
  • status欄位等於published這個值
  • publish_date欄位包含日期大於等於 1 Jan 2015

GET _search
    "query": {  
    "bool": {
        "must": [ 
             { "match": { "title": "Search" }},  
             { "match": { "content": "Elasticsearch" }}
         ], 
         "filter": [  
             { "term": { "status": "published" }},  
             { "range": { "publish_date": { "gte": "2015-01-01" }}}  
          ] 
    } 
  }
}

query 參數代表query context
  
bool 和 兩個被用在query context match 子句 
代表被用來評分每個document的match程度
filter 參數代表 filter context
 
termrange 子句 被用在 filter context.
他們將會篩選出沒有符合但不影響符合資料評分的資料
也就是說 filter篩選出的資料中比較不精準,但還是會符合條件

Math All Query
  • 找出所有的documents, 所有的documents的_score都會是1.0
  • 例如:  {  "match_all":  {  }  }
  • _score可以藉由boost改變值
    • {  "match_all":  {  "boost":  1.2  }  }
Full text queries










留言

這個網誌中的熱門文章

[MySQL] schema 與資料類型優化

[翻譯] 介紹現代網路負載平衡與代理伺服器