Milvus
Zilliz
  • Home
  • Blog
  • Milvus 2.6 中的词组匹配与泔水:如何提高词组级全文搜索的准确性

Milvus 2.6 中的词组匹配与泔水:如何提高词组级全文搜索的准确性

  • Tutorials
December 29, 2025
Alex Zhang

随着非结构化数据的持续爆炸式增长和人工智能模型的不断智能化,向量搜索已成为许多人工智能系统--RAG 管道、人工智能搜索、Agent、推荐引擎等的默认检索层。它之所以有效,是因为它能捕捉到意义:不仅仅是用户输入的字词,还有它们背后的意图。

然而,一旦这些应用投入生产,团队往往会发现语义理解只是检索问题的一个方面。许多工作负载还依赖于严格的文本规则,例如匹配准确的术语、保留词序或识别具有技术、法律或操作符意义的短语。

Milvus 2.6通过直接在向量数据库中引入本机全文搜索,消除了这种分裂。通过在核心引擎中内置标记和位置索引,Milvus 可以解释查询的语义意图,同时执行精确的关键字和短语级约束。这样就形成了一个统一的检索管道,在这个管道中,意义和结构相互促进,而不是各自为政。

短语匹配是这种全文功能的关键部分。它可以识别按顺序一起出现的术语序列--这对于检测日志模式、错误签名、产品名称以及任何词序定义意义的文本至关重要。在这篇文章中,我们将解释短语匹配Milvus 中的工作原理,slop 如何增加现实世界文本所需的灵活性,以及为什么这些功能使向量-全文混合搜索不仅成为可能,而且在单个数据库中非常实用。

什么是短语匹配?

短语匹配是 Milvus 中的一种全文查询类型,侧重于结构--具体来说,是指文档中的一连串单词是否以相同的顺序出现。当不允许有任何灵活性时,查询就会严格执行:词语必须相邻并按顺序出现。因此,像"机器人机器学习 "这样的查询只有在这三个词作为连续短语出现时才会匹配。

问题在于,真实文本很少有如此严谨的表现。自然语言会带来噪音:额外的形容词会溜进来,日志会对字段重新排序,产品名称会增加修饰词,而且人类作者在写作时并没有考虑到查询引擎。严格的短语匹配很容易被破坏--插入的一个词、一个重新措辞或一个交换的术语都可能导致匹配失败。而在许多人工智能系统中,尤其是面向生产的系统中,漏掉相关的日志行或规则触发短语是不可接受的。

Milvus 2.6 通过一个简单的机制解决了这一摩擦:"泔水"。回旋余地定义了查询之间允许的回旋余地。您可以决定是否允许多出一个词或两个词,甚至是否允许轻微的重新排序也算作匹配,而不是将短语视为脆弱而不灵活的。这就将短语搜索从二进制的 "通过-失败 "测试转变为一种可控、可调整的检索工具。

要理解这一点的重要性,可以想象一下搜索日志,查找我们熟悉的网络错误"连接被对等重置 "的所有变体实际上,你的日志可能是这样的

connection reset by peer
connection fast reset by peer
connection was suddenly reset by the peer
peer reset connection by ...
peer unexpected connection reset happened

一目了然,所有这些都代表着同一个基本事件。但常见的检索方法却很难做到这一点:

BM25 在结构上有困难。

它将查询视为一袋关键字,忽略了关键字出现的顺序。只要 "连接 "和 "对等 "出现在某个地方,BM25 就会把文档排在前面--即使这个短语是颠倒的或与你实际搜索的概念无关。

向量搜索难以应对各种限制。

Embeddings 擅长捕捉意义和语义关系,但它们无法强制执行 "这些词必须以这种顺序出现 "这样的规则。您可能会检索到语义相关的信息,但仍会错过调试或合规所需的确切结构模式。

短语匹配法填补了这两种方法之间的空白。通过使用"斜率",你可以精确地指定可接受的变化程度:

  • slop = 0 - 完全匹配(所有术语必须按顺序连续出现。)

  • slop = 1 - 允许多一个词(用一个插入词涵盖常见的自然语言变化。)

  • slop = 2 - 允许插入多个词(处理更多描述性或冗长的措辞。)

  • slop = 3 - 允许重新排序(支持顺序颠倒或松散的短语,这通常是现实世界文本中最难处理的情况。)

与希望评分算法 "正确 "相比,您可以明确声明您的应用程序所需的结构容差。

短语匹配在 Milvus 中的工作原理

Milvus 中的短语匹配由Tantivy搜索引擎库提供支持,是在带有位置信息的倒排索引基础上实现的。它不只是检查术语是否出现在文档中,而是验证它们是否以正确的顺序出现,并且距离在可控范围内。

下图说明了这一过程:

1.文档标记化(带位置)

当文档插入 Milvus 时,文本字段由分析器处理,分析器将文本分割成标记(单词或术语),并记录每个标记在文档中的位置。例如,doc_1 被标记为:machine (pos=0), learning (pos=1), boosts (pos=2), efficiency (pos=3).

2.创建倒排索引

接下来,Milvus 会建立一个倒排索引。倒排索引不是将文档映射到文档内容,而是将每个标记映射到出现该标记的文档,以及该标记在每个文档中的所有记录位置。

3.短语匹配

当执行短语查询时,Milvus 首先使用倒排索引来识别包含所有查询标记的文档。然后,它通过比较标记位置来验证每个候选词,以确保术语出现的顺序正确,且距离在允许的slop 范围内。只有满足这两个条件的文档才会作为匹配文档返回。

下图总结了短语匹配的端到端工作方式。

如何在 Milvus 启用词组匹配功能

短语匹配适用于以下类型的字段 VARCHAR,即 Milvus 中的字符串类型。要使用它,必须配置 Collections Schema,以便 Milvus 执行文本分析并存储字段的位置信息。这需要启用两个参数:enable_analyzerenable_match

设置 enable_analyzer 和 enable_match

要打开特定 VARCHAR 字段的短语匹配,请在定义字段 Schema 时将这两个参数设置为True 。这两个参数会告诉 Milvus

  • 标记文本(通过enable_analyzer ),并

  • 使用位置偏移建立反向索引(通过enable_match )。

短语匹配依赖于这两个步骤:分析器将文本分解为标记,匹配索引存储这些标记出现的位置,从而实现高效的短语和基于斜线的查询。

以下是在text 字段上启用短语匹配的 Schema 配置示例:

from pymilvus import MilvusClient, DataType

schema = MilvusClient.create_schema(enable_dynamic_field=False) schema.add_field( field_name=“id”, datatype=DataType.INT64, is_primary=True, auto_id=True ) schema.add_field( field_name=‘text’, # Name of the field datatype=DataType.VARCHAR, # Field data type set as VARCHAR (string) max_length=1000, # Maximum length of the string enable_analyzer=True, # Enables text analysis (tokenization) enable_match=True # Enables inverted indexing for phrase matching ) schema.add_field( field_name=“embeddings”, datatype=DataType.FLOAT_VECTOR, dim=5 )

使用短语匹配搜索:泔水如何影响候选集

为 Collections 模式中的 VARCHAR 字段启用匹配后,就可以使用PHRASE_MATCH 表达式执行短语匹配。

注意:PHRASE_MATCH 表达式不区分大小写。可以使用PHRASE_MATCHphrase_match

在搜索操作中,短语匹配通常在向量相似性排序之前应用。它首先根据明确的文本限制过滤文档,缩小候选集的范围。然后使用向量嵌入重新对剩余的文档进行排序。

下面的示例展示了不同的slop 值对这一过程的影响。通过调整slop 参数,您可以直接控制哪些文档通过了短语过滤器并进入向量排序阶段。

假设你有一个名为tech_articles 的 Collections,其中包含以下五个实体:

doc_id文本
1机器学习提高了大规模数据分析的效率
2学习基于机器的方法对现代人工智能的进步至关重要
3深度学习机器架构优化计算负荷
4机器迅速提高持续学习的模型性能
5学习先进的机器算法,扩展人工智能能力

slop=1

在此,我们允许 1 的斜率。该过滤器适用于包含 "学习机器 "短语的文档,并略有灵活性。

# Example: Filter documents containing "learning machine" with slop=1
filter_slop1 = "PHRASE_MATCH(text, 'learning machine', 1)"

result_slop1 = client.search( collection_name=“tech_articles”, anns_field=“embeddings”, data=[query_vector], filter=filter_slop1, search_params={“params”: {“nprobe”: 10}}, limit=10, output_fields=[“id”, “text”] )

匹配结果:

doc_id文本
2学习基于机器的方法对现代人工智能的进步至关重要
3深度学习机器架构优化计算负荷
5学习先进的机器算法可扩展人工智能能力

slop=2

本示例允许 2 的斜率,即在 "机器 "和 "学习 "之间允许最多两个额外的词块(或反义词)。

# Example: Filter documents containing "machine learning" with slop=2
filter_slop2 = "PHRASE_MATCH(text, 'machine learning', 2)"

result_slop2 = client.search( collection_name=“tech_articles”, anns_field=“embeddings”, # Vector field name data=[query_vector], # Query vector filter=filter_slop2, # Filter expression search_params={“params”: {“nprobe”: 10}}, limit=10, # Maximum results to return output_fields=[“id”, “text”] )

匹配结果:

doc_id文本
1机器学习提高了大规模数据分析的效率
3深度学习机器架构优化计算负载

slop=3

在本例中,3 的斜率提供了更大的灵活性。过滤器搜索 "机器学习",单词之间最多允许有三个标记位置。

# Example: Filter documents containing "machine learning" with slop=3
filter_slop3 = "PHRASE_MATCH(text, 'machine learning', 3)"

result_slop2 = client.search( collection_name=“tech_articles”, anns_field=“embeddings”, # Vector field name data=[query_vector], # Query vector filter=filter_slop3, # Filter expression search_params={“params”: {“nprobe”: 10}}, limit=10, # Maximum results to return output_fields=[“id”, “text”] )

匹配结果:

doc_id文本
1机器学习提高了大规模数据分析的效率
2学习基于机器的方法对现代人工智能的进步至关重要
3深度学习机器架构优化计算负荷
5学习先进的机器算法可扩展人工智能能力

快速提示:在 Milvus 中启用短语匹配前需要了解的信息

短语匹配支持短语级过滤,但启用短语匹配涉及的不仅仅是查询时的配置。在生产环境中应用前,了解相关注意事项很有帮助。

  • 在字段上启用短语匹配会创建一个反向索引,从而增加存储空间的使用。具体成本取决于文本长度、唯一标记数和分析器配置等因素。在处理大型文本字段或高 Cardinal 性数据时,应预先考虑这一开销。

  • 分析器配置是另一个关键的设计选择。一旦在 Collections Schema 中定义了分析器,就不能更改。以后要切换到不同的分析器,就必须放弃现有的 Collections,然后用新的 Schema 重新创建。因此,分析器的选择应被视为一项长期决策,而不是实验。

  • 短语匹配行为与文本的标记化方式密切相关。在将分析器应用于整个 Collections 之前,建议使用run_analyzer 方法检查标记化输出,并确认其是否符合您的预期。这一步骤有助于避免细微的不匹配和意外的查询结果。有关详细信息,请参阅分析器概述

结论

短语匹配是一种核心全文搜索类型,可实现短语级和位置限制,而不是简单的关键字匹配。通过对标记顺序和邻近性进行操作,它提供了一种可预测的精确方法,可根据术语在文本中的实际出现方式过滤文档。

在现代检索系统中,短语匹配通常应用于基于向量的排序之前。它首先将候选集限制为明确满足所需短语或结构的文档。然后再使用向量搜索按语义相关性对这些结果进行排序。这种模式在日志分析、技术文档搜索和 RAG 管道等场景中尤为有效,因为在这些场景中,必须在考虑语义相似性之前执行文本限制。

Milvus 2.6 引入slop 参数后,短语匹配对自然语言变化的容忍度提高了,同时保留了其作为全文过滤机制的作用。这使得短语级约束更容易应用于生产检索工作流中。

请使用演示脚本进行尝试,并探索Milvus 2.6,了解短语感知检索如何与您的堆栈相匹配。

对最新版 Milvus 的任何功能有疑问或想深入了解?加入我们的 Discord 频道或在 GitHub 上提交问题。您还可以通过 Milvus Office Hours 预订 20 分钟的一对一课程,以获得见解、指导和问题解答。

    Try Managed Milvus for Free

    Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

    Get Started

    Like the article? Spread the word

    扩展阅读