Elasticsearch 參考指南(查詢和過濾器上下文)

查詢和過濾器上下文

查詢子句的行爲取決於它是在查詢上下文中使用仍是在過濾器上下文中使用:緩存

查詢上下文

查詢上下文中使用的查詢子句回答了「這個文檔與這個查詢子句的匹配程度如何?」,除了決定文檔是否匹配以外,查詢子句還計算一個表示文檔匹配程度的_score,相對於其餘文檔。elasticsearch

當查詢子句被傳遞給query參數時,查詢上下文就生效,例如search API中的query參數。性能

過濾器上下文

在過濾器上下文中,查詢子句回答了「這個文檔與這個查詢子句匹配嗎?」,答案很簡單,是或者不是 - 沒有計算分數,過濾器上下文主要用於過濾結構化數據,例如:code

  • 這個timestamp屬於2015年到2016年的範圍嗎?
  • status字段是否設置爲"published"?

頻繁使用的過濾器將自動經過Elasticsearch緩存,以提升性能。文檔

當查詢子句被傳遞給filter參數時,過濾器上下文就生效,例如bool查詢中的filtermust_not參數,constant_score查詢中的filter參數或filter聚合。it

下面是一個查詢子句示例,用於search API中的查詢和過濾器上下文,此查詢將匹配知足如下全部條件的文檔:ast

  • title字段包含單詞search
  • content字段包含單詞elasticsearch
  • status 字段包含精確的單詞published
  • publish_date 字段包含從2015年1月1日起的日期。
GET /_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}
  • query參數代表查詢上下文。
  • bool和兩個match子句在查詢上下文中使用,這意味着它們用於對每一個文檔匹配的程度進行打分。
  • filter參數表示過濾器上下文。
  • termrange子句用於過濾器上下文,他們會過濾掉不匹配的文檔,但不會影響匹配文檔的分數。
在查詢上下文中使用查詢子句來處理可能影響匹配文檔得分的條件(即文檔匹配的程度),並在過濾器上下文中使用全部其餘查詢子句。
相關文章
相關標籤/搜索