全文搜索中的部分匹配允许查找包含搜索词的变体或子集的文档,而不是要求精确匹配。这可以通过分词、n-gram 索引和通配符查询等技术实现。与精确关键词搜索不同,部分匹配会考虑词语中的前缀、后缀或子字符串,这使其对于自动完成、容错(处理拼写错误)或灵活查询非常有用。例如,根据使用的方法,搜索“app”可能会返回包含“apple”、“application”或“snappier”的结果。
一种常见的方法涉及 n-gram 分词,其中词语被分解为更小的重叠字符序列。例如,“apple”的三元组(3 个字符序列)将生成“app”、“ppl”和“ple”等词元。当用户搜索“app”时,搜索引擎会将三元组“app”与索引中的词语进行匹配。这种方法对于子字符串匹配很有效,但由于存储多个 n-gram 会增加索引大小。边缘 n-gram(侧重于前缀,例如“apple”的“a”、“ap”、“app”)常用于自动完成功能。Elasticsearch 等搜索引擎利用这一点,通过配置分析器在索引时生成边缘 n-gram,从而实现快速的基于前缀的查询。
另一种方法使用 通配符,例如 *
(匹配任何序列)或 ?
(匹配单个字符)。例如,像“app*
”这样的查询会匹配以“app”开头的词语,而“*
pple”会匹配以“pple”结尾的词语。然而,前导通配符(例如 *
pple)可能会很慢,除非有反向索引的支持。一些引擎还支持 模糊匹配,它通过测量编辑距离来容忍拼写错误(例如,“apl”与“apple”通过一次插入匹配)。虽然不完全是部分匹配,但模糊技术通过处理近似词语来补充部分匹配。PostgreSQL 等数据库使用 LIKE
子句或全文扩展(例如 tsvector
)进行基本的部分匹配,但性能各异。开发者必须平衡精度、索引大小和查询速度——n-gram 和通配符以存储换取灵活性,而模糊方法则优先考虑容错而非精确匹配。