尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

什么是混合搜索?

什么是混合搜索? 两种或更多检索方法。一个排序列表。混合搜索是一种信息检索技术它将两种或更多搜索方法例如词汇搜索/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
返回列表