Milvus 2.6 中的词组匹配与泔水:如何提高词组级全文搜索的准确性
随着非结构化数据的持续爆炸式增长和人工智能模型的不断智能化,向量搜索已成为许多人工智能系统--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_analyzer 和enable_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_MATCH 或phrase_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 StartedLike the article? Spread the word



