es的查詢和過濾context

741439599發表於2021-11-17

relevances scores 相關性分數

預設情況下,Elasticsearch 通過 relevance score對查詢結果進行排序,relevance score衡量每個文件匹配查詢的程度。

relevance score是一個正的浮點數,在搜尋API的_score後設資料欄位中返回。_score越高,說明文件越相關。雖然每種查詢型別可以以不同的方式計算相關性得分,但得分計算還取決於查詢子句是在查詢上下文中執行還是在篩選器上下文中執行。

Query context

在查詢上下文中,查詢子句回答“該文件與該查詢子句的匹配程度如何?”除了決定文件是否匹配外,查詢子句還在_score後設資料欄位中計算一個相關性得分。

只要將查詢子句傳遞給查詢引數(例如搜尋API中的查詢引數),查詢上下文就會生效。

Filter context

在篩選器上下文中,查詢子句回答“這個文件匹配這個查詢子句嗎?”答案是簡單的“是”或“否”——不計算分數。過濾上下文主要用於過濾結構化資料,例如:

  • 這個時間戳是在2015年到2016年之間嗎?
  • 狀態欄位是否設定為“已釋出”?

Elasticsearch會自動快取經常使用的過濾器,以提高效能。

過濾器上下文在將查詢子句傳遞給過濾器引數時生效,比如bool查詢中的Filtermust_not引數、constant_score查詢中的Filter引數或過濾器聚合。

Example of query and fileter contexts

下面是在搜尋API的查詢和篩選上下文中使用查詢子句的示例。該查詢將匹配滿足以下所有條件的文件:

  • title欄位包含單詞search
  • content欄位包含單詞elasticsearch
  • status欄位包含精確欄位 published
  • publisg_date欄位包含 從2015年1月起的日期
    GET /_search
    {
    "query": { 
      "bool": { 
        "must": [
          { "match": { "title":   "Search"        }},
          { "match": { "content": "Elasticsearch" }}
        ],
        "filter": [ 
          { "term":  { "status": "published" }},
          { "range": { "publish_date": { "gte": "2015-01-01" }}}
        ]
      }
    }
    }
  1. query參數列示查詢上下文

  2. bool和兩個match子句用於查詢上下文中,這表示它們用於為每個文件的匹配情況打分。

  3. filter參數列示過濾上下文。’term’和’range’子句用於查詢上下文中。它們會過濾掉不匹配的文件,但是它們不會影響匹配文件的得分。

    警告:在查詢上下文中為查詢計算的分數用單精度浮點數表示,他們只有24位的有效數的精度。超過有效數精度的分數計算將被轉換為浮點數,並且會損失精度。

    提示:在查詢上下文中使用查詢子句來處理應該影響匹配文件得分的條件(即文件匹配的好壞),並在過濾器上下文中使用所有其他查詢子句。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章