
兩種或更多檢索方法。一個排序列表。混合搜索是一種信息檢索技術它將兩種或更多搜索方法例如詞匯搜索/lexical 和語義搜索結合到一個統一的排序列表中以提升相關性和召回率。最常見的組合是將全文詞匯搜索與語義向量搜索結合起來。全文詞匯搜索非常擅長匹配精確的詞語和短語而語義向量搜索則能夠理解查詢背后的含義。詞匯搜索提供精準性語義搜索則能夠深入理解用戶的潛在意圖。這些方法會在一個查詢中同時運行然后使用專門的融合策略將它們的結果合并成一個統一的排序結果。雖然詞匯搜索 語義搜索是最常見的組合但混合搜索也可以結合其他方法例如地理空間搜索 語義搜索甚至文本搜索 圖像搜索以滿足不同的需求。為什么混合搜索很重要混合搜索可以在單一流程中利用不同檢索方法的優勢同時彌補各自的不足。現代 AI 必須處理多種模態包括文本、圖像、音頻、日志等并將用戶意圖與數據連接起來。相關性比以往任何時候都更加重要。例如在電子商務中如果搜索體驗能夠幫助用戶快速篩選和細化結果就可以取得成功但 AI agent 通常需要一個高度相關的答案來回答問題或執行操作。這就是為什么能夠組合和優化檢索技術在今天如此重要它不僅為傳統搜索結果提供支持也為能夠提供精準、以數據為依據的響應的對話式 agent 提供支持。在進一步深入了解混合搜索之前我們先快速了解一下詞匯搜索和語義搜索有何不同以及為什么它們能夠互補。詞匯搜索解析當你擁有結構良好的數據并且用戶知道自己要找什么時詞匯搜索非常理想。它能夠匹配精確的詞語因此具有很高的精準性和可解釋性并依賴相關性評分算法例如 BM25F根據查詢詞的頻率和稀有程度對文檔進行排序。這種方法能夠提供透明的評分并通過字段 boost、同義詞和分析器實現精細的相關性調優。由于沒有模型開銷詞匯搜索快速且高效并且通過過濾器和分面即使在大規模場景下也能穩定執行不會出現性能下降或完整索引掃描。它尤其適用于結構化查詢、稀有詞和領域特定語言。下面是一個簡單的詞匯搜索查詢示例GET example-index/_search { query: { term: { text: blue shoes } } }讓我們再來看一個類似的詞匯搜索示例這次使用 Elasticsearch Query LanguageES|QL查詢一個烹飪博客。該博客包含各種食譜并具有包括文本內容、分類數據和數值評分在內的各種屬性。FROM cooking_blog METADATA _score | WHERE description:fluffy pancakes | KEEP title, description, _score | SORT _score DESC | LIMIT 1000這個查詢會在description字段中搜索包含“fluffy”或“pancakes”或兩者的文檔。默認情況下ES|QL會在搜索詞之間使用 OR 邏輯因此會匹配包含任意指定詞語的文檔。你可以使用 KEEP 命令準確指定要在結果中包含哪些字段并請求_score元數據根據文檔與查詢的匹配程度對搜索結果進行排序。通過這個實踐教程進一步了解詞匯搜索。語義搜索解析語義搜索根據查詢與文檔之間的語義相似度來檢索結果而不僅僅像詞匯搜索那樣匹配精確的詞語。Embedding 模型會將文本或其他媒體的含義轉換成一種稱為向量的數值表示。這些向量 —— 一組數字 —— 能夠捕捉文本背后的上下文和主題并存儲在類似 Elasticsearch 的向量數據庫中。密集向量密集向量處理語義理解和上下文查詢。它們在現代機器學習中廣泛使用尤其是在生成嵌入等任務中。一長串數字每個維度一個數字。在數據集上訓練 → “在域內”一只德國德國牧羊犬的向量表示is_redis_dogblue_sky…no_grasgerman_shepherdis_treeGerman shepherd embeddings0.01210.95720.8735…0.11980.97120.0512這樣即使結果與查詢之間沒有任何完全相同的詞語搜索引擎也能夠找到概念上相似的結果。這種方法特別適用于非結構化數據、探索性查詢以及用戶可能不知道應該使用哪些確切詞語的場景。開發人員可以利用語義搜索提供更相關的結果并處理模糊、冗長或含義不明確的表達同時仍然找到正確的答案。下面是一個語義搜索查詢示例GET example-index/_search { query: { semantic: { field: inference_field, query: blue waterproof trail runners with great grip and a wide toe box } } }當你的映射中包含semantic_text類型的字段時ES|QL 支持語義搜索。文檔經過運行在 inference endpoint 上的底層模型處理后你就可以執行語義搜索。下面是一個針對semantic_description字段的自然語言查詢示例FROM cooking_blog METADATA _score | WHERE semantic_description:What are some easy to prepare but nutritious plant-based meals? | SORT _score DESC | LIMIT 5進一步了解語義搜索或者嘗試這個實踐教程進行深入學習。像 BM25F 這樣的詞匯算法在查詢詞與文檔詞語匹配時能夠提供出色的精準性但當相關內容以不同的方式表達時就會失效。例如查詢 “athletic footwear” 可能無法找到只寫了 “shoes” 或 “trail runner” 的文檔。語義向量搜索使用高維 embedding 和近似最近鄰ANN算法例如 HNSW無論精確詞語是否重疊都能夠檢索出概念上相似的文檔 —— 但當上下文存在歧義時也可能引入噪聲。混合搜索如何工作如果你可以同時獲得兩者的優勢呢這就是混合搜索。如果實現得當混合搜索的效果不只是各部分簡單相加它可以產生遠優于單獨使用詞匯搜索或語義搜索的結果。混合搜索可以同時提供兩者的優勢帶來更加均衡的相關性、更高的歸一化折損累計增益NDCG以及更高的召回率而無需額外部署第二套搜索系統。下面是一個混合搜索查詢示例GET example-index/_search { retriever: { rrf: { retrievers: [ { standard: { query: { term: { description: shoes } } } }, { knn: { field: vector, query_vector: [1.25, 2, 3.5], k: 50, num_candidates: 100 } } ], rank_constant: 20, rank_window_size: 50 } } }你也可以在 ES|QL 中組合全文搜索和語義查詢。在這個示例中我們使用自定義權重將全文搜索和語義搜索結合起來FROM my-index METADATA _score | FORK ( WHERE match(text_field:shoes) | SORT _score DESC | LIMIT 50) ( WHERE knn(vector, [1.25, 2, 3.5], { min_candidates : 100 }) | SORT _score DESC | LIMIT 50 ) // k for knn is derived from LIMIT | FUSE RRF WITH { rank_constant: 20 } | SORT _score DESC | LIMIT 50執行混合搜索查詢通常需要至少執行一次詞匯搜索和一次語義搜索然后將它們的結果結合起來。其中最大的挑戰在于如何將多個已排序的結果列表合并成一個統一且連貫的排序結果。由 BM25F 或 TF-IDF 等算法生成的詞匯搜索分數可能沒有上限其最大值會受到詞頻和文檔分布的影響。相比之下語義搜索分數通常位于一個固定范圍內該范圍由相似度函數決定例如余弦相似度的范圍為 [0, 2]。要將它們合并你需要一種融合方法在合并過程中保持檢索文檔之間的相對相關性。使用 Elasticsearch 進行混合搜索使用 Elasticsearch 實現混合搜索可以將標準關鍵詞查詢與向量查詢結合起來也可以使用 retriever —— 一種能夠運行多種不同類型的查詢并使用選定的評分方法將它們的結果合并成一個統一排序列表的搜索選項。這樣可以在一次搜索調用中實現多階段檢索流程無需發送多個請求也無需額外編寫客戶端邏輯來合并結果。結合 RAG 及混合搜索我們的數據流是這樣的Elasticsearch 提供了兩種內置的融合方法倒數排名融合RRF和線性組合API 中通常稱為 linear retriever。兩者都旨在生成一個統一的排序結果同時保留各個 retriever 的優勢但它們處理分數的方式不同最適用的場景也不同。倒數排名融合完全忽略原始分數只關注文檔在每個列表中的排名位置。排名靠前的文檔會獲得較高的獎勵而出現在多個列表中的文檔會獲得累加的 boost。這種方法具有很強的魯棒性因為它避開了不同分數范圍不兼容的問題除了 rank 常數之外幾乎不需要調優并且能夠自然地提升頂部結果的多樣性。RRF 會根據文檔在結果集中的排名對文檔進行評分使用以下公式其中 k 是一個用于調整低排名文檔重要性的任意常數RRF 特別適用于不同 retriever 的頂部結果存在一定重疊的場景以及開發人員需要一種即插即用的解決方案而不需要帶標簽的訓練數據或復雜的校準。相比之下線性組合會直接合并每個 retriever 的實際分數。由于詞匯搜索和語義搜索的分數處于非常不同的尺度因此線性組合需要進行歸一化例如使用min-max 縮放將分數轉換到可比較的范圍。完成歸一化后會使用代表每個 retriever 相對重要性的權重對分數進行融合。權重大于 1 會增強某個 retriever 的影響力而權重小于 1 則會降低其影響力。這種方法提供了細粒度的控制當關鍵詞精準性很重要時開發人員可以提高 BM25F 的權重當用戶意圖和上下文至關重要時可以偏向語義相似度還可以將額外的業務或個性化信號與檢索分數結合起來。當權重經過仔細校準后線性組合可以通過生成更加準確且可預測的排序結果而優于 RRF但它確實需要進行實驗并且對特定數據集的調優較為敏感。線性組合會使用各自的權重以及 β其中 0 ≤ α、β來組合詞匯搜索結果和語義搜索結果其公式如下在實踐中RRF 是混合搜索的最佳起點因為它簡單并且能夠很好地應對不同分數尺度不匹配的問題。它無需大量調優就能產生良好的結果因此非常適合原型開發或不同 retriever 的結果存在重疊的場景。線性組合則更適合不同檢索方法返回互不重疊的結果或者需要仔細平衡詞匯、語義和外部信號的場景。簡而言之RRF 可以開箱即用地提供快速、可靠的混合能力而線性組合在針對具體應用和數據調優權重及歸一化器后則具有更高的潛在準確性。總結如下倒數排名融合RRF線性組合Linear combination? 即插即用? 對每個信號進行等權重處理? 當結果列表存在重疊時效果出色? 提升頂部結果的多樣性? 只需調節一個參數rank_constant從 RRF 開始可以快速獲得穩定的混合搜索結果。? 使用歸一化后的分數進行加權融合? 可以優先考慮業務或個性化信號? 能很好地處理互不重疊的結果集? 可以選擇歸一化器來控制偏差?提供細粒度的控制當你準備進一步精細調優相關性時再轉向線性組合。簡而言之線性組合linear combination在經過調優后具有更高的潛在準確性而RRF更容易實現并且無需帶標簽的訓練數據也能取得良好的效果。可以通過這個教程進一步了解混合搜索。是各種方法中最優的zzz混合搜是各種方法中最優的混合搜索是各種方法中最優的混合搜索的檢索流程詞匯檢索BM25F 將查詢詞與索引中的 token 進行匹配非常適合精準匹配、結構化過濾以及可解釋的評分。語義檢索向量稠密向量或稀疏向量表示文本的語義相似度搜索能夠找到相關內容即使它們與查詢之間沒有共同的詞語。融合使用RRF、加權融合或 linear retriever 將結果進行組合。過濾器和 boost 可以一致地應用于這兩種檢索方式。搜索類型工作原理結果表現適用場景詞匯搜索Lexical search查詢“red running shoes size 10”將查詢中的精確詞語與文檔中的詞語進行匹配BM25F、TF-IDF、分析器、同義詞。找到標題或描述中包含這些精確 token 的商品例如“Nike Mens Red Running Shoes, Size 10”。用戶非常明確自己想要什么。精準、可解釋且高效。語義搜索Semantic search查詢“lightweight shoes for jogging”使用 embedding 捕捉語義和上下文而不僅僅是關鍵詞。即使詞語不匹配也能找到概念上相關的結果。可以返回“Adidas Cloudfoam Running Sneakers, Size 10”即使其中沒有直接出現“lightweight”和“jogging”。用戶通過自然語言描述自己的意圖。適合模糊或描述性的查詢。混合搜索Hybrid search查詢“comfortable dress shoes for office”結合詞匯和語義搜索結果然后融合它們的排序例如使用 RRF。同時檢索精確匹配的結果例如“Black Leather Dress Shoes, Comfort Fit”以及語義相關的結果例如“Loafers with cushioned insoles”并按照相關性統一排序。查詢同時包含精確條件和用戶意圖。能夠在準確性與探索能力之間取得平衡。深入了解混合搜索解析稠密向量和稀疏向量Elasticsearch 中的語義搜索通過將查詢和文檔轉換為能夠捕捉語義的向量表示來實現。混合搜索將詞匯檢索與語義檢索結合起來而語義檢索既可以使用稠密模型也可以使用稀疏模型。稠密向量稠密向量是由 BERT 等模型生成的固定長度數字數組其中語義相似的輸入例如 cat 和 kitten在向量空間中的距離更近因此非常適合語義匹配、推薦和相似度搜索。當文本被轉換為稠密向量后其形式如下[ 0.13586345314979553, -0.6291824579238892, 0.32779985666275024, 0.36690405011177063, ... ]每個維度都包含有意義的信息使得向量中充滿數據。語義相似的內容會生成在向量空間中彼此接近的 embedding。在 Elasticsearch 中稠密向量存儲在dense_vector字段中并使用 HNSW 等近似最近鄰ANN算法進行查詢。這非常適合捕捉文本、圖像或其他內容的整體語義。POST my-index/_search { retriever: { rrf: { retrievers: [ { standard: { query: { match: { text_field: fox } } } }, { knn: { field: title_vector, query_vector: [0.1, 3.2, 2.1], k: 5, num_candidates: 100 } } ] } } }下面是一個 ES|QL 示例FROM my-index METADATA _score | FORK ( WHERE match(text_field:fox) | SORT _score DESC | LIMIT 5) ( WHERE knn(image_vector, [0.1, 3.2, 2.1], { min_candidates : 100 }) | SORT _score DESC | LIMIT 5 ) | FUSE | SORT _score DESC如上所示一個混合搜索查詢只需使用rrfretriever將通過標準 retriever 執行的詞匯搜索查詢例如match查詢與knnretriever 中指定的向量搜索查詢結合起來即可。該查詢首先在全局范圍內檢索排名前五的向量匹配結果然后將它們與詞匯搜索匹配結果進行融合最后返回最匹配的 10 個結果。rrfretriever 使用 RRF 排名方法來融合向量搜索和詞匯搜索的匹配結果。理解稀疏向量和 ELSER稠密 embedding 并不是實現語義搜索的唯一方式。稀疏向量大部分維度都是零只有少數帶權重的值與可解釋的詞語相關聯因此具有資源效率高、可解釋性強以及在 zero-shot 場景下效果良好等特點。稀疏向量的表示形式如下{f1:1.2,f2:0.3,…}在 Elasticsearch 中Elastic Learned Sparse EncodeRELSER是一種域外稀疏自然語言處理NLP模型它會將文本擴展為語義相關的詞語并為這些詞語分配權重從而在保留可解釋性的同時實現超越精確關鍵詞匹配的搜索。此外semantic_text 字段讓語義搜索像傳統文本搜索一樣簡單因為它會在 ingest 時自動處理 embedding 生成和推理。你可以像索引text字段一樣索引文檔然后執行一個簡單的match查詢——即使跨索引查詢時字段類型不同也可以同時獲得詞匯和語義匹配而無需額外的查詢邏輯。對于更高級的控制可以在同一字段上使用knn或sparse_vector查詢。使用 ELSER 的示例基于約 30,000 個詞語的詞匯表進行預訓練以sparse_vector詞語/權重對的形式存儲在 ingest 時通過semantic_text自動生成或者在索引時通過 inference ingest processor 生成通過倒排索引進行查詢類似詞匯搜索因此具有高效、易于過濾且可解釋等特點POST my-index/_search { retriever: { rrf: { retrievers: [ { standard: { query: { match: { text_field: fox } } } }, { standard: { query: { sparse_vector: { field: ml.tokens, inference_id: .elser_model_1, query: a quick brown fox jumps over a lazy dog } } } } ] } } }稠密向量和稀疏向量結合起來可以提供更大的靈活性稠密向量擅長捕捉細微的語義而稀疏向量則能夠為實際生產環境中的搜索提供更高的透明度和可擴展性。了解使用 ELSER 進行文本擴展如何幫助你獲得更好的搜索結果ELSER 文本擴展_嗶哩嗶哩_bilibili實際應用中的稀疏向量與稠密向量稀疏向量ELSER稠密向量工作原理將文本擴展為語義相關的、帶權重的詞語。每個維度對應一個 token并帶有相應的權重。將內容文本、圖像等編碼為固定長度的浮點向量。語義越相似在向量空間中的位置越接近。優勢? 結果可解釋詞語 權重? 與關鍵詞相關性自然結合? 非常適合領域特定詞匯? 能夠捕捉深層語義? 支持多模態文本、圖像、音頻? 擅長自然語言和相似度匹配典型使用場景? 通過文本擴展增強關鍵詞搜索? 對合規和審計友好的企業搜索? 技術或受監管領域的專業搜索? 將自然語言問題與答案進行匹配? 圖像或多媒體相似度搜索? 基于內容的推薦理想場景當你需要提升語義能力和透明度或者領域特定詞語最重要時當你需要捕捉深層語義、自然語言意圖或跨模態相似性時使用稠密和稀疏模型進行混合搜索到目前為止我們已經了解了兩種不同的混合搜索方式具體取決于搜索的是稠密向量空間還是稀疏向量空間。我們也可以在同一個索引中同時混合稠密數據和稀疏數據。POST my-index/_search { _source: false, fields: [ text_field ], retriever: { rrf: { retrievers: [ { knn: { field: image_vector, query_vector: [0.1, 3.2, ..., 2.1], k: 5, num_candidates: 100 } }, { standard: { query: { sparse_vector: { field: ml.tokens, inference_id: .elser_model_1, query: a quick brown fox jumps over a lazy dog } } } } ] } } }進一步探索結合稠密向量、稀疏向量和 BM25F 的混合搜索這個示例結合了三種 retriever并使用 RRF 融合它們的排序列表BM25F在text上執行match精準匹配關鍵詞或短語例如“snowy mountain”kNNimage_vector使用提供的圖像 embedding 進行視覺相似度搜索從num_candidates中獲取 k 個結果Semanticsemantic_text通過對查詢進行語義擴展來匹配概念rank_window_size控制參與融合的結果數量rank_constant用于平衡每個結果列表的貢獻。GET my-index/_search { retriever: { rrf: { retrievers: [ { standard: { query: { match: { text: { query: snowy mountain } } } } }, { knn: { field: image_vector, query_vector: [ 0.01, 0.3, -0.4 ], k: 10, num_candidates: 100 } }, { standard: { query: { semantic: { field: semantic_text, query: snowy mountain } } } } ], rank_window_size: 50, rank_constant: 60 } } }讓我們再來看一個類似的 ES|QL 示例FROM my-index METADATA _score | FORK (WHERE match(text, snowy mountain) | SORT _score DESC | LIMIT 50) (WHERE knn(image_vector, [0.01, 0.3, -0.4], {min_candidates: 100 }) | SORT _score DESC | LIMIT 50) (WHERE match(semantic_text, snowy mountain) | SORT _score DESC | LIMIT 50) | FUSE RRF WITH {rank_constant: 60 } // 60 is the default anyway? | SORT _score DESC | LIMIT 50總結混合搜索將全文搜索的精準性與語義搜索的上下文理解能力結合起來從而能夠針對不同類型的內容提供更加準確、相關的結果。通過同時支持稠密和稀疏模型以及線性組合和倒數排名融合等靈活的融合方法你可以根據具體使用場景定制檢索方式——無論是直接組合查詢和向量還是使用 retriever 簡化多階段檢索。這種靈活性使混合搜索成為處理復雜查詢、多樣化數據以及高相關性要求的強大方法。進一步了解混合搜索閱讀這篇博客了解什么是混合搜索、Elasticsearch 支持哪些查詢類型以及如何構建混合搜索。You know, for context — 混合搜索與上下文工程的演進ES|QL 中的混合搜索和多階段檢索混合搜索不再令人頭疼使用 retriever 簡化 Elasticsearch 中的混合搜索想要超越向量搜索可以了解 Elasticsearch 中的使用 LLM agents 實現智能混合搜索。準備動手實踐了嗎可以按照我們的混合搜索教程將全文搜索和 kNN 結果結合起來或者嘗試ES|QL 教程使用 ES|QL 進行搜索和過濾。原文What is hybrid search? How it works and when to use it | Elastic