Elasticsearch 查詢與過濾

狼爺發表於2021-03-13

簡介

Elasticsearch 使用的查詢語言(DSL)擁有一套查詢元件,這些元件可以以無限組合的方式進行搭配。這套元件可以在以下兩種情況下使用:過濾上下文(filtering context)和查詢上下文(query context)。

說明

當使用於過濾上下文時,查詢被設定成一個“不評分”或者“過濾”查詢。即這個查詢只是簡單的問一個問題:“這篇文件是否匹配?”。回答也是非常的簡單,yes 或者 no ,二者必居其一。

典型用法

created 時間是否在 2013 與 2014 這個區間?
status 欄位是否包含 published 這個單詞?
lat_lon 欄位表示的位置是否在指定點的 10km 範圍內?

當使用於查詢上下文時,查詢就變成了一個“評分”的查詢。和不評分的查詢類似,也要去判斷這個文件是否匹配,同時它還需要判斷這個文件匹配的有 多好(匹配程度如何)。

效能差異

過濾查詢(Filtering queries)只是簡單的檢查包含或者排除,這就使得計算起來非常快。考慮到至少有一個過濾查詢(filtering query)的結果是 “稀少的”(很少匹配的文件),並且經常使用不評分查詢(non-scoring queries),結果會被快取到記憶體中以便快速讀取,所以有各種各樣的手段來優化查詢結果。

相反,評分查詢(scoring queries)不僅僅要找出匹配的文件,還要計算每個匹配文件的相關性,計算相關性使得它們比不評分查詢費力的多。同時,查詢結果並不快取。

語法

query的基礎語法

GET movies/_search
{
  "query": {
    "match": {
      "title": {
        "query": "beautiful"
      }
    }
  }
}

filter的語法,一般跟著constant_score、bool

GET movies/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "title": "beautiful"
        }
      }
    }
  }
}

GET movies/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "title": "beautiful"
          }
        },
        {
          "range": {
            "movieId": {
              "gte": 94,
              "lte": 1000
            }
          }
        }
      ]
    }
  }
}

如何選擇查詢與過濾

通常的規則是,使用查詢(query)語句來進行全文搜尋或者其它任何需要影響相關性得分的搜尋。除此以外的情況都使用過濾(filters)。

資料

相關文章