Elasticsearch:向量搜索過濾 - 保持相關性

作者:來自 Elastic?Carlos Delgado

僅執行向量搜索以找到與查詢最相似的結果是不夠的。通常需要過濾來縮小搜索結果。本文解釋了在 Elasticsearch 和 Apache Lucene 中向量搜索的過濾是如何工作的。

Elasticsearch 擁有豐富的新功能,幫助你為自己的用例構建最佳搜索解決方案。深入查看我們的示例筆記本以了解更多,開始免費的云試用,或在本地機器上嘗試 Elastic。


向量搜索并不足以找到相關結果。使用過濾條件來縮小搜索結果、排除無關結果是非常常見的。

理解過濾在向量搜索中的工作方式將幫助你平衡性能與召回率之間的取舍,同時還能發現一些在使用過濾時提升向量搜索性能的優化方法。

為什么要過濾?

向量搜索(Vector search)徹底改變了我們在大型數據集中查找相關信息的方式,使我們能夠發現與查詢在語義上相似的項目。

然而,僅僅找到相似項目還不夠。我們常常需要根據特定條件或屬性來縮小搜索結果。

想象一下你在電商商店中搜索某個商品。純粹的向量搜索可能會顯示與你在視覺上相似的商品,但你可能還想按價格范圍、品牌、庫存情況或用戶評分來過濾。如果沒有過濾,你將會看到一大堆相似的商品,很難找到你真正需要的。

過濾使搜索結果的控制更加精確,確保檢索到的項目不僅在語義上匹配,而且滿足所有必要的要求。這帶來了更加準確、高效且用戶友好的搜索體驗。

這正是 Elasticsearch 和 Apache Lucene 的優勢所在 —— 在各種數據類型上使用有效過濾,是它們與其他向量數據庫的關鍵區別之一。

精確向量搜索的過濾

執行精確向量搜索有兩種主要方式:

  • 對 dense_vector 字段使用 flat 索引類型。這會讓 knn 搜索使用精確搜索而不是近似搜索。

  • 使用 script_score 查詢,通過向量函數計算得分。這可以與任意索引類型一起使用。

當執行精確向量搜索時,所有向量都會與查詢進行比較。在這種情況下,過濾會提升性能,因為只有通過過濾的向量才需要比較。

這不會影響結果質量,因為無論如何所有向量都會被考慮。我們只是提前過濾掉不感興趣的結果,從而減少運算次數。

這點非常重要,因為當應用的過濾條件使結果文檔數量很少時,執行精確搜索可能比執行近似搜索更高效。

經驗法則是:當過濾后少于 10k 文檔時使用精確搜索。BBQ 索引在比較時要快得多,所以對于基于該索引的情況,如果少于 100k,也很適合使用精確搜索。更多細節請查看這篇博客文章。

如果你的過濾條件總是非常嚴格,可以考慮通過使用 flat 索引類型而不是基于 HNSW 的類型,讓索引專注于精確搜索而不是近似搜索。更多細節見 index_options 的屬性。

近似向量搜索的過濾

在執行近似向量搜索時,我們以結果的準確性換取性能。像 HNSW 這樣的向量搜索數據結構能高效地在數百萬向量中搜索近似最近鄰。它們專注于通過最少的向量比較(計算代價高昂)來檢索最相似的向量。

這意味著其他過濾屬性并不是向量數據的一部分。不同的數據類型有各自高效的索引結構來查找和過濾,例如 terms 字典、posting lists 和 doc values。

由于這些數據結構與向量搜索機制是分開的,那么如何將過濾應用到向量搜索呢?有兩種選擇:在向量搜索之后應用過濾(后過濾,postfiltering)或在向量搜索之前應用過濾(前過濾,prefiltering)。

這兩種方式各有優缺點。下面我們深入看看!

后過濾(Postfiltering)

后過濾是在向量搜索完成后再應用過濾。這意味著過濾在找到 top k 個最相似的向量結果之后才會執行。

顯然,在應用過濾后我們可能會得到少于 k 的結果。當然,我們可以從向量搜索中檢索更多結果(更高的 k 值),但我們不能確定在應用過濾后一定能得到 k 個或更多結果。

后過濾的優點是它不會改變向量搜索的運行行為 —— 向量搜索對過濾毫不知情。但它會改變最終檢索到的結果數量。

下面是一個使用 knn 查詢進行后過濾的示例。注意過濾子句與 knn 查詢是分開的:

{"query": {"bool": {"must": {"knn": {"field": "image-vector","query_vector": [54, 10, -2],"k": 5,"num_candidates": 50}},"filter": {"term": {"file-type": "png"}}}}
}

后過濾也可以通過在 knn 搜索中使用 post-filter 來實現:

{"knn": {"field": "image-vector","query_vector": [54, 10, 2],"k": 5,"num_candidates": 50},"post_filter": {"term": {"file-type": "png"}}
}

請記住,在 knn 搜索中你需要使用顯式的 post-filter 部分。如果你不使用 post-filter,knn 搜索會把最近鄰結果與其他查詢或過濾條件組合,而不是執行后過濾。

前過濾(Prefiltering)

在向量搜索之前應用過濾會先檢索滿足過濾條件的文檔,然后把這些信息傳遞給向量搜索。

Lucene 使用 BitSet 來高效存儲滿足過濾條件的文檔。向量搜索隨后遍歷 HNSW 圖,同時考慮滿足條件的文檔。在把候選項加入結果之前,它會檢查該候選項是否包含在有效文檔的 BitSet 中。

但是,即使候選項不是有效文檔,它也必須被探索并與查詢比較。HNSW 的有效性依賴于圖中向量之間的連接 —— 如果我們停止探索某個候選項,就可能會錯過它的鄰居。

這就像開車去加油站。如果你丟棄所有沒有加油站的道路,你很可能到不了目的地。其他道路可能不是你需要的,但它們能把你連接到目的地。HNSW 圖上的向量也是同樣的道理!

因此,應用前過濾的性能會比不使用過濾更差。我們需要對搜索中訪問的所有向量進行處理,并丟棄那些不匹配過濾條件的。這意味著要做更多工作,花更多時間才能得到 top k 結果。

下面是 Elasticsearch Query DSL 中前過濾的示例。注意過濾子句現在是 knn 部分的一部分:

{"knn": {"field": "image-vector","query_vector": [54, 10, -2],"k": 5,"num_candidates": 50,"filter": {"term": {"file-type": "png"}}}
}

前過濾可用于 knn 搜索和 knn 查詢:

{"query": {"knn": {"field": "image-vector","query_vector": [-5, 9, -12],"k": 5,"filter": {"term": {"file-type": "png"}}}}
}

前過濾優化

有一些優化方法可以確保前過濾的性能:

  • 如果過濾條件非常嚴格,可以切換到精確搜索。當需要比較的向量很少時,在滿足過濾條件的少量文檔上執行精確搜索會更快。
    這種優化在 Lucene 和 Elasticsearch 中是自動應用的。

  • 另一種優化方法是忽略不滿足過濾條件的向量。相反,該方法檢查通過過濾的向量的鄰居。這樣有效減少了比較次數,因為不滿足條件的向量不會被考慮,同時仍會繼續探索與當前路徑相連的向量。? ? ? ? ? ??

請注意入口點和第一個有效過濾集之間的過濾 “差距”。在典型的圖表中,可能會存在這樣的差距,導致探索過早結束并導致召回率不佳。

這種算法稱為 ACORN-1,具體過程在這篇博客文章中有詳細描述。

使用文檔級安全進行過濾

文檔級安全(DLS)是 Elasticsearch 的一項功能,用于指定用戶角色可以檢索的文檔。

DLS 通過查詢執行。角色可以與索引關聯一個查詢,這有效限制了屬于該角色的用戶可以從索引中檢索的文檔。

角色查詢用作過濾器以檢索匹配的文檔,并作為 BitSet 緩存。然后使用這個 BitSet 包裝底層的 Lucene reader,這樣只有查詢返回的文檔被視為有效 —— 也就是說,它們存在于索引中且未被刪除。

當從 reader 中檢索有效文檔以執行 knn 查詢時,只會考慮用戶可用的文檔。如果有前過濾,DLS 文檔將被添加到前過濾中。

這意味著 DLS 過濾作為近似向量搜索的前過濾,其性能影響和優化方法相同。

在精確搜索中使用 DLS 與應用任何過濾器具有相同的好處 —— 從 DLS 檢索的文檔越少,精確搜索的性能越高。同時還要考慮 DLS 返回的文檔數量 —— 如果 DLS 角色非常嚴格,你可以考慮使用精確搜索而不是近似搜索。

基準測試

在 Elasticsearch,我們希望確保向量搜索過濾高效。我們有專門的向量過濾基準測試,它對不同的過濾條件執行近似向量搜索,以確保向量搜索盡可能快速地檢索相關結果。

查看 ACORN-1 引入時的改進。在測試中,只有 2% 的向量通過過濾,查詢延遲降低到原始時間的 55%:

結論

過濾是搜索的重要組成部分。確保向量搜索中過濾的高性能,并理解其權衡和優化,是實現高效且準確搜索的關鍵。

過濾會影響向量搜索的性能:

  • 使用過濾時,精確搜索更快。如果你的過濾條件足夠嚴格,應考慮使用精確搜索而不是近似搜索。這在 Elasticsearch 中是自動優化的。

  • 使用前過濾時,近似搜索會更慢。前過濾可以讓我們獲得符合過濾條件的 top k 結果,但代價是搜索速度變慢。

  • 后過濾不一定能檢索到 top k 結果,因為應用過濾后部分結果可能被過濾掉。

祝過濾愉快!

原文:Vector search filtering: Keep it relevant - Elasticsearch Labs

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

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

相關文章

Linux 性能調優之 OOM Killer 的認知與觀測

寫在前面 博文內容涉及到OOM Killer機制,以及利用 Cgroup/dmesg/BPF 觀測 OOM Killer 事件,包括云原生環境下的 OOM Killer 機制的簡單介紹 這是內存調優的最后一篇,之后會分享一些網絡調優相關內容 理解不足小伙伴幫忙指正 ??,生活加油 我不再將這個世界與我所期待的,塑…

webrtc之高通濾波——HighPassFilter源碼及原理分析

文章目錄前言一、導讀二、高通濾波過程1.HighPassFilter的創建1)HighPassFilter的作用2)開啟條件3)開啟配置2.高通濾波整體過程1)觸發時機2)濾波器創建3)高通濾波過程三、算法實現1.原理1)濾波器…

《sklearn機器學習——聚類性能指數》同質性,完整性和 V-measure

函數:homogeneity_score 參數: labels_true: array-like, shape [n_samples] 樣本的真實標簽。 labels_pred: array-like, shape [n_samples] 樣本的預測標簽。返回值: h: float 同質性得分,在0到1之間,值越大表示聚…

HarmonyOS 應用開發新范式:深入剖析 Stage 模型與 ArkTS 狀態管理

好的,請看這篇關于 HarmonyOS 應用開發中 Stage 模型與 ArkTS 狀態管理的技術文章。 HarmonyOS 應用開發新范式:深入剖析 Stage 模型與 ArkTS 狀態管理 引言 隨著 HarmonyOS 4、5 的發布以及 API 12 的迭代,HarmonyOS 的應用開發范式已經全面…

一個Java的main方法在JVM中的執行流程

一個Java的main方法在JVM中的執行流程可以分為??四大階段??:??加載 -> 鏈接 -> 初始化 -> 執行??。// HelloWorld.java public class HelloWorld {public static void main(String[] args) {String message "Hello, JVM!";System.out.p…

聚焦診斷管理(DM)的傳輸層設計、診斷服務器實現、事件與通信管理、生命周期與報告五大核心模塊

聚焦診斷管理(DM)的傳輸層設計、診斷服務器實現、事件與通信管理、生命周期與報告五大核心模塊,明確 UDS(ISO 14229-1)與 SOVD(ASAM 服務化診斷)的功能邏輯、交互流程及規范性要求(SWS_DM 系列)。 1 UDS 傳輸層(UDS Transport Layer) 作為 DM 與診斷客戶端的 UDS …

關于npm的鉤子函數

一、npm scripts 的生命周期鉤子(Lifecycle Scripts) npm 提供了一些 ??特殊的 script 名稱??,它們是 ??生命周期鉤子??,會在特定時機 ??自動執行??。這些鉤子包括: 1.prepublishOnly(在 npm publish之前執…

167.在Vue3中使用OpenLayers模仿共享單車,判斷點是否放在規劃的電子圍欄內

一、前言大家好,這里分享一個 Vue3 OpenLayers 的小案例: 模仿共享單車的電子圍欄功能,用戶在地圖上繪制停泊點時,系統會自動判斷該點是否在規劃好的電子圍欄內(多邊形或圓形)。這個功能在實際項目中有很大…

鍵盤上面有F3,四,R,F,V,按下沒有反應,維修記錄

打開游戲,按了好幾遍F,結果都沒反應,但是左右上下行走是沒問題的。一臉懵逼???打開鍵盤測試網頁,發現有一列沒反應,F1不是,F1我定義了一個快捷鍵,跟測試沖突了…

8051單片機-成為點燈大師

第三章 成為點燈大師 1. 硬件設計 上一章說到,怎么點亮LED燈,很簡單啊,就是把P2口設置成低電平就行了。接下來讓我們更進一步,完成LED閃爍、流水燈實驗2. 軟件設計 2.1 LED閃爍實驗 為了使LED閃爍,我們自然而然的想到要…

Rust 日志庫完全指南:從入門到精通

GitHub 倉庫: https://github.com/zhouByte-hub/rust-study ? 如果這個項目對您有幫助,請給我一個 star! 在 Rust 生態系統中,日志處理是一個至關重要的環節。無論是開發小型應用還是大型系統,良好的日志記錄都能幫助我們追蹤問題…

【科研繪圖系列】R語言繪制論文合集圖

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 數據準備與過濾 統計分析 可視化繪圖 抗藥性分析 系統發育分析 加載R包 數據下載 Supp figure 1 Fig 1a Fig 1c Fig 1d Fig 1e Fig 1f Supp figure 3 Supp figure 4 Supp figure 5…

【c++】從三個類的設計看軟件架構的哲學思考

從三個類的設計看軟件架構的哲學思考 文章目錄從三個類的設計看軟件架構的哲學思考前言一、OP類:系統工程的安全守護者設計特點設計哲學適用場景現實類比二、VarReviser類:版本控制的嚴謹管理者設計特點設計哲學適用場景現實類比三、Model類:…

人工智能優化SEO關鍵詞的實戰策略

本文聚焦智能技術如何革新關鍵詞優化實踐,系統解析提升網站排名的核心路徑。重點探討語義分析如何精準匹配用戶意圖、長尾詞智能挖掘怎樣解鎖高潛力流量,并詳解工具篩選高轉化關鍵詞的五大實用策略。通過實戰案例說明技術如何突破流量增長瓶頸&#xff0…

【c++】c++第一課:命名空間

文章目錄1.C的第?個程序2.命名空間2.1 namespace的價值2.2 namespace的定義2.3 命名空間使?最新的c標準(建議收藏) 1.C的第?個程序 C兼容C語?絕?多數的語法,所以C語?實現的helloworld依舊可以運?,C中需要把定義?件代碼后…

版本發布流程手冊:Release分支規范與Bug分級標準全解析

在軟件交付日益高頻、用戶需求快速迭代的今天,版本發布流程的規范性直接決定了團隊的交付效率、產品質量和用戶滿意度。然而,許多團隊仍面臨以下痛點: 發布混亂:分支管理隨意,代碼沖突頻發;質量失控&#…

什么是CA根證書

CA 根證書(Certificate Authority Root Certificate)是 數字證書體系(PKI,Public Key Infrastructure) 中的核心證書。它有幾個關鍵點:1. 定義 CA(Certificate Authority)&#xff1…

git push -u origin main 這個-u起什么作用

git push -u origin main 里的 -u 等價于 --set-upstream,它的作用是:👉 把本地分支 main 和遠程分支 origin/main 綁定(建立追蹤關系)。🔹 具體效果第一次推送分支時,如果加了 -u:本…

【Unity基礎】兩個關于UGUI中Text對非英文字體支持的問題

問題1:Unity中為什么UGUI中的Text(Textmeshpro)默認不支持非英文字體,而legacy中的text卻可以呢? 在Unity中,TextMeshPro(TMP)默認不支持非英文字體,而Legacy Text支持,主…

碎片時間干活的好手(requestIdleCallback)

🟢 What —— 它是什么? requestIdleCallback(callback[, options]) 是瀏覽器提供的一個 API,用來在主線程空閑時執行一些優先級不高的任務。 它的特點: 異步執行:不會打斷關鍵的渲染、交互、動畫。節省性能&#xff1…