ES中must與filter的區別

在 Elasticsearch 的布爾查詢(bool query)中,mustfilter 是兩個核心子句,它們的核心區別在于 是否影響相關性評分,這直接決定了它們在查詢性能、使用場景和結果排序上的差異。以下是詳細對比:

一、核心區別

二、底層原理

1.?must?子句
  • 執行流程

    1. 對每個文檔執行查詢條件
    2. 計算匹配條件的相關性評分(_score
    3. 合并所有?must?子句的評分(默認相加)
    4. 按總分排序結果
  • 典型應用
{"query": {"bool": {"must": [{ "match": { "title": "elasticsearch" } },  // 全文搜索{ "range": { "price": { "gte": 100 } } }    // 范圍條件(但需要影響排序)]}}
}
2.?filter?子句
  • 執行流程

    1. 使用倒排索引快速過濾文檔(無需計算評分)
    2. 結果集返回匹配文檔(不排序)
    3. 若與其他評分查詢組合,僅傳遞過濾后的文檔給評分模塊
  • 典型應用

{"query": {"bool": {"must": [ { "match": { "title": "elasticsearch" } } ],"filter": [ { "term": { "status": "published" } },      // 精確匹配{ "range": { "publish_date": { "gte": "2023-01-01" } } }]}}
}

三、使用場景對比

1.?必須使用?must?的場景
  • 需求涉及相關性排序:?例如:搜索商品時,關鍵詞匹配度高的結果需要排在前面。
  • 需要組合多個相關性條件:?例如:同時匹配標題和內容的關鍵詞,且兩者的匹配度共同影響排序。
2.?必須使用?filter?的場景
  • 精確篩選數據:?例如:過濾出狀態為“已發布”、價格在 100-500 元之間的商品。
  • 高頻重復查詢:?例如:電商平臺首頁的“促銷商品”篩選(同樣條件會被多次執行)。
  • 不關心排序的過濾:?例如:審計日志的時間范圍過濾,結果按時間倒序即可。

四、性能優化技巧

1.?層級優化原則

將過濾條件盡量放在 filter 中,優先縮小數據集:

{"query": {"bool": {"must": [ { "match": { "content": "性能優化" } } ],"filter": [{ "term": { "category": "技術文檔" } },{ "range": { "view_count": { "gte": 1000 } } }]}}
}
2.?強制跳過評分

must 中的非相關性條件使用 constant_score

{"query": {"bool": {"must": [{ "match": { "title": "elasticsearch" } },{ "constant_score": {     // 此條件不貢獻評分"filter": { "term": { "version": "7.x" } },"boost": 0   // 評分權重設為0}}]}}
}
3.?緩存驗證

通過 _search API 的 profile 參數驗證是否命中緩存:

GET /index/_search?request_cache=true
{"query": { "bool": { "filter": [ {...} ] } }
}

五、錯誤使用案例

1.?誤用?must?導致性能下降
// 錯誤:用 must 處理精確匹配
{"bool": {"must": [{ "term": { "status": "active" } },  // 精確條件應放在 filter{ "range": { "age": { "gte": 18 } } }]}
}
2.?誤用?filter?導致排序失效
// 錯誤:用 filter 處理需要影響排序的條件
{"bool": {"must": [ { "match": { "title": "緊急通知" } } ],"filter": [ { "range": { "priority": { "gte": 5 } } } ]  // priority 應影響排序}
}

六、高級組合用法

1.?混合使用提升性能
{"query": {"bool": {"must": [ { "match": { "text": "error" } } ],"filter": [{ "term": { "service": "gateway" } },{ "range": { "@timestamp": { "gte": "now-1h" } } }]}}
}
2.?嵌套 bool 查詢
{"query": {"bool": {"must": [{ "match": { "title": "系統故障" } },{ "bool": { "filter": [    // 嵌套的過濾條件{ "term": { "environment": "prod" } },{ "range": { "severity": { "gte": 3 } } }]}}]}}
}

七、總結

  • must?的本質:貢獻相關性評分的條件,適用于需要影響結果排序的場景。
  • filter?的本質:高效的二進制過濾器,適用于精確匹配和高頻查詢。
  • 黃金法則:?能用?filter?的不要用?must?—— 除非明確需要該條件影響評分。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83458.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83458.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83458.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vscode實時預覽編輯markdown

vscode實時預覽編輯markdown 點擊vsode界面,實現快捷鍵如下: 按下快捷鍵 CtrlShiftV(Windows/Linux)或 CommandShiftV(Mac)即可在側邊欄打開 Markdown 預覽。 效果如下:

Android第十一次面試flutter篇

Flutter基礎? 在 Flutter 中,?三棵樹(Widget Tree、Element Tree、RenderObject Tree)?? 是框架的核心設計,它們協同工作以實現高效的 UI 渲染和更新機制。 ?1. Widget Tree(Widget 樹)?? ?是什么…

多線程編程中的數據競爭與內存可見性問題解析

引言 在多線程編程中,看似簡單的代碼往往隱藏著復雜的并發問題。今天我們來分析一個經典的生產者-消費者場景,看看在多核CPU環境下可能出現的各種"意外"情況。 問題代碼分析 讓我們先看看這段看似正常的C#代碼: using System; u…

Linux 與 Windows:哪個操作系統適合你?

Linux vs Windows:系統選擇的關鍵考量 在數字化轉型浪潮中,操作系統作為底層基礎設施的重要性日益凸顯。Linux與Windows作為主流選擇,其差異不僅體現在技術架構上,更深刻影響著開發效率、運維成本與安全性。本文將從??7個核心維度??展開對比分析,并提供典型應用場景建…

佰力博科技與您探討低溫介電溫譜測試儀的應用領域

低溫介電溫譜測試應用領域有如下: 一、電子材料: 低溫介電溫譜測試儀廣泛應用于電子材料的性能測試,如陶瓷材料、半導體材料、壓電材料等。通過該設備,可以評估材料在高溫或低溫環境下的介電性能,為材料的優化和應用提…

Windows 下徹底刪除 VsCode

徹底刪除 VS Code (Visual Studio Code) 意味著不僅要卸載應用程序本身,還要刪除所有相關的配置文件、用戶數據、插件和緩存。這可以確保你有一個完全干凈的狀態,方便你重新安裝或只是徹底移除它。 重要提示: 在執行以下操作之前&#xff0c…

STM32與GD32標準外設庫深度對比

近年來,隨著全球芯片短缺和市場價格波動,工程師們開始尋求對常用MCU的替代方案。在STM32因產能受限而頻頻漲價的背景下,GD32作為國產替代的重要選項,獲得了越來越多的關注。尤其是GD32F103系列,由于其在硬件封裝、功能特性乃至軟件支持上的“高相似度”,成為STM32F103的熱…

使用Redis的四個常見問題及其解決方案

Redis 緩存穿透 定義:redis查詢一個不存在的數據,導致每次都查詢數據庫 解決方案: 如果查詢的數據為空,在redis對應的key緩存空數據,并設置短TTL。 因為緩存穿透通常是因為被惡意用不存在的查詢參數進行壓測攻擊&…

Java高級 | 【實驗一】Spring Boot安裝及測試 最新

隸屬文章:Java高級 | (二十二)Java常用類庫-CSDN博客 目錄 一、SpringBoot的特點 二、Spring Boot安裝及測試 (一)安裝Intellij IDEA (二)安裝MySQL (三)安裝postma…

Oracle RMAN自動恢復測試腳本

說明 此恢復測試腳本,基于rman備份腳本文章使用的fullbak.sh做的備份。 數據庫將被恢復到RESTORE_LO參數設置的位置。 在恢復完成后,執行一個測試sql,確認數據庫恢復完成,數據庫備份是好的。恢復測試數據庫的參數,比如SGA大小都…

從Java的JDK源碼中學設計模式之裝飾器模式

裝飾器模式是一種極具彈性的結構型設計模式,它允許我們通過組合的方式動態擴展對象功能而無需修改原有結構。本文將通過JDK源碼中的實際應用和通俗易懂的代碼示例,帶你深入了解這一強大模式的精髓。 裝飾器模式核心原理 裝飾器模式的核心思想&#xff…

調教 DeepSeek - 輸出精致的 HTML MARKDOWN

【序言】 不知道是不是我閑的蛋疼,對百度AI 和 DeepSeek 的回答都不太滿意。 DeepSeek 回答句子的引用鏈接,始終無法準確定位。有時鏈接只是一個域名,有時它給的鏈接是搜索串如: baidu.com/?q"搜索內容"。 百度AI 回答句子的引用…

第1章_數據分析認知_知識點筆記

來自:數據分析自學課程-戴戴戴師兄 逐字稿:【課程4.0】第1章_分析認知_知識點筆記 【課程4.0】第1章 分析認知 知識點總結 一、數據分析的本質認知 數據分析是什么? 不是酷炫看板、復雜模型或升值秘籍,而是認知世界的基礎方法。…

【從0-1的HTML】第2篇:HTML標簽

文章目錄 1.標題標簽2.段落標簽3.文本標簽brbstrongsubsup 4.超鏈接標簽5.圖片標簽6.表格標簽7.列表標簽有序列表ol無序列表ul定義列表dl 8.表單標簽9.音頻標簽10.視頻標簽11.HTML元素分類塊級元素內聯元素 12.HTML布局13.內聯框架13.內聯框架 1.標題標簽 標題標簽&#xff1a…

快速排序(Quick Sort)算法詳解(遞歸與非遞歸)

引言 在計算機科學中,排序算法是最基礎且重要的算法之一。快速排序(Quick Sort)作為一種高效的排序算法,在實際應用中被廣泛使用。平均時間復雜度為 (O(n log n)),最壞情況下為 (O(n^2))。本文將詳細介紹快速排序算法…

修改 vscode 左側導航欄的文字大小 (更新版)

新增, 個人常用 按 Ctrl Shift P 打開命令面板 輸入并選擇 : Developer: Toggle Developer Tools 打開開發者工具。 1. 起因, 目的: 問題: vscode 左側的文字太小了!!!我最火的一篇文章,寫的就是這個…

Kerberos面試內容整理-Kerberos 的配置與排障

正確配置 Kerberos 對其正常工作至關重要。在Linux/Unix環境下,Kerberos配置通常通過編輯配置文件(例如 /etc/krb5.conf)完成。其中指定了Realm名稱、KDC和管理員服務器地址、默認域到Realm的映射等參數。管理員需要在KDC端初始化數據庫并創建主體(可以使用 kadmin 等工具添…

Windows + CPU也能跑時序預測:TSLib框架快速上手與踩坑避雷

在時序預測領域,選擇一個成熟的框架往往能讓我們事半功倍。最近接手了一個緊急的時序預測項目,經過一番調研后,我選擇了TSLib(Time-Series-Library)這個優秀的開源框架來快速搭建整個預測流程。 由于開發環境限制在Windows平臺且沒有GPU支持,整個部署過程還是遇到了一些…

從 0 到 1:用 Trae 插件 Builder 模式開發端午包粽子小游戲

? 前言 Trae插件獲取:https://www.trae.com.cn/plugin 在編程的世界里,效率就是生命。我們開發者常常為了一個項目的搭建,重復著創建文件夾、初始化項目配置、編寫樣板代碼等一系列繁瑣的操作,耗費了大量的時間和精力。而如今…

React-native之Flexbox

本文總結: 我們學到了 React Native 的 Flexbox 布局,它讓寫樣式變得更方便啦!😊 Flexbox 就像一個有彈性的盒子,有主軸和交叉軸(行或列)。 在 RN 里寫樣式要用 StyleSheet.create 對象,屬性名…