ES 23 - 檢索和過濾的區別 (query vs. filter)

来源:https://www.cnblogs.com/shoufeng/archive/2019/07/31/11278046.html
-Advertisement-
Play Games

從相關度評分和性能表現兩個角度對比 Elasticsearch 中檢索(query)和過濾(filter)的區別: (1) query性能較差, 但支持排序; (2) filter性能優於query, 但不支持按照匹配的相關度進行排序. ...


目錄

本文以 ES 6.6.5 版本為例進行演示.

1 filter與query示例

1.1 準備測試數據

PUT website/_doc/1
{
    "title": "小白學ES01",
    "desc": "the first blog about es",
    "level": 1, 
    "post_date": "2018-10-10",
    "post_address": {
        "country": "China",
        "province": "GuangDong",
        "city": "GuangZhou"
    }
}

PUT website/_doc/2
{
    "title": "小白學ES02",
    "desc": "the second blog about es",
    "level": 3,
    "post_date": "2018-11-11",
    "post_address": {
        "country": "China",
        "province": "ZheJiang",
        "city": "HangZhou"
    }
}

1.2 搜索測試

搜索條件: 搜索博客等級(level)大於等於2, 同時發佈日期(post_date)是2018-11-11的博客:

(1) 不使用filter:

GET website/_doc/_search
{
    "query": {
        "bool": {
            "must": [
                { "match": { "post_date": "2018-11-11" } }, 
                { "range": { "level": { "gte": 2 } } }
            ]
        }
    }
}
// 結果信息: 
"hits": {
    "total": 1,
    "max_score": 2.0,
    "hits": [
        {
            "_index": "website2",
            "_type": "blog",
            "_id": "2",
            "_score": 2.0,          // 評分為2.0
            "_source": {
                "title": "小白學ES02",
                "desc": "the second blog about es",
                "level": 3,
                "post_date": "2018-11-11",
                "post_address": {
                    "country": "China",
                    "province": "ZheJiang",
                    "city": "HangZhou"
                }
            }
        }
    ]
}

(2) 使用filter:

GET website/_doc/_search
{
    "query": {
        "bool": {
            "must": { 
                "match": { "post_date": "2018-11-11" }
            }, 
            "filter": {
                "range": { "level": { "gte": 2 } }
            }
        }
    }
}
// 結果信息: 
"hits": {
    "total": 1,
    "max_score": 1.0,
    "hits": [
        {
            "_index": "website2",
            "_type": "blog",
            "_id": "2",
            "_score": 1.0,      // 評分為1.0
            "_source": {
                "title": "小白學ES02",
                "desc": "the second blog about es",
                "level": 3,
                "post_date": "2018-11-11",
                "post_address": {
                    "country": "China",
                    "province": "ZheJiang",
                    "city": "HangZhou"
                }
            }
        }
    ]
}

2 filter與query的區別

filter和query一起使用時, 會先執行filter.

2.1 相關度處理上的不同

filter —— 只根據搜索條件過濾出符合的文檔, 將這些文檔的評分固定為1, 忽略TF/IDF信息, 不計算相關度分數;
query —— 先查詢符合搜索條件的文檔, 然後計算每個文檔對於搜索條件的相關度分數, 再根據評分倒序排序.

建議:

  • 如果對搜索結果有排序的要求, 要將最匹配的文檔排在最前面, 就用query;
  • 如果只是根據一定的條件篩選出部分數據, 不關註結果的排序, 就用filter.

2.2 性能上的對比

filter 性能更好, 無排序 —— 不計算相關度分數, 不用根據相關度分數進行排序, 同時ES內部還會緩存(cache)比較常用的filter的數據 (使用bitset <0或1> 來記錄包含與否).

query 性能較差, 有排序 —— 要計算相關度分數, 要根據相關度分數進行排序, 並且沒有cache功能.

2.3 對比結論

1) 業務關心的、需要根據匹配的相關度進行排序的搜索條件 放在 query 中;

2) 業務不關心、不需要根據匹配的相關度進行排序的搜索條件 放在 filter 中.

版權聲明

作者: 馬瘦風(https://healchow.com)

出處: 博客園 馬瘦風的博客(https://www.cnblogs.com/shoufeng)

感謝閱讀, 如果文章有幫助或啟發到你, 點個[

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本篇內容: 本篇內容: 進程與線程(進程管理) 進程狀態切換 進程調度演算法 進程同步 進程通信 進程與線程(進程管理) 進程狀態切換 進程調度演算法 進程同步 進程通信 (一)進程管理 (一)進程管理 進程和線程的區別: 進程和線程的區別: 定義區別: 定義區別: 進程是資源分配的基本單位。進程式控制制塊 ...
  • 環境說明演示vip自動漂移 192.168.237.50 192.168.237.51 vip: 192.168.237.5 keepalived開源軟體實現 keepalived可以實現當vip掛的時候,自動漂移,基於vrrp虛擬路由冗餘協議 主備,vrrp去宣告 存在問題 主起來後又會接管vip ...
  • 本文首發於:微信公眾號「運維之美」,公眾號 ID:Hi Linux。 ​「運維之美」是一個有情懷、有態度,專註於 Linux 運維相關技術文章分享的公眾號。公眾號致力於為廣大運維工作者分享各類技術文章和發佈最前沿的科技信息。公眾號的核心理念是:分享,我們認為只有分享才能使我們的團體更強大。如果你想第 ...
  • SQL Server in Docker 還原資料庫 上一會演示瞭如果在Docker環境下安裝SQL Server,這次我們來演示下如何還原一個資料庫備份文件到資料庫實例上。 使用winscp上傳bak文件到linux伺服器 上一回我們啟動docker容器的時候使用了 v參數掛賬了本地目錄/hd2/ ...
  • 前言: 上篇文章我們介紹了入門MySQL的基本概念,看完上篇文章,相信你應該瞭解MySQL的前世今生了吧。本篇文章將帶你從架構體系來學習MySQL。我認為學習MySQL架構體系應該是入門階段必須的,雖然可能看不太明白,暫時也用不到,但是我們心中要有這些概念,瞭解結構體系對於後續的學習是很有幫助的。 ...
  • 我們都知道建立索引能夠提高查詢效率,那麼是不是任何情況下都能提高呢,當然不是的的,下麵我們就來列舉一些常見的索引失效的場景。借用上一篇文章的dm_person_info表在card_code列沒加索引的時,查詢時間如下,大概都在0.07秒。 我們來加上索引試試,加上後查詢效率高了許多。 在正確使用索 ...
  • 問題:第1天給丈母娘1分錢,第2天給2分錢,第3天給4分錢,以此類推,每天給前一天的2倍,給一個月(按30天)算就行。問:第30天給多少錢,總共給多少錢? 解決方案:1)while迴圈方法(不推薦)一般思維可能就會定義一些變數,然後通過while進行迴圈,腳本會比較繁瑣。這種方法大部分人都能想到,即 ...
  • 存儲過程:對sql的封裝和重用,經編譯創建並保存在資料庫中,通過指定存儲過程的名字並給定參數(需要時)來調用執行。 優缺點: (1) 優點: 執行速度快 存儲過程只在創建時進行編譯,以後每次執行存儲過程都不需要重新編譯,而一般SQL語句沒執行一次就需編譯一次,所以使用存儲過程可提高資料庫的執行速度; ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...