全文搜索与向量搜索的对比
对全文搜索、向量搜索和混合搜索的比较分析。

在当今的信息海洋中穿梭,既令人惊叹又充满挑战。全文搜索和向量搜索使我们能够构建搜索体验,帮助用户找到相关产品、内容等。随着我们对搜索的精确性和上下文理解的追求不断发展,一个问题浮出水面:我们能否在全文搜索的词法灵活性与向量搜索的语义深度之间取得平衡?
让我们一起探讨每种解决方案的优缺点,并发现正在重新定义现代搜索与发现体验的协同效应。
全文搜索
全文搜索指将文本查询的全部或部分内容与数据库中存储的文档进行匹配。与传统数据库查询相比,全文搜索即使在部分匹配的情况下也能提供结果。它允许为用户构建更灵活的搜索界面,从而使他们能够更快地找到准确的结果。
在实践中,高效的全文搜索解决方案具备对拼写错误、同义词、前缀搜索和模糊匹配的容错能力。这些功能使用户即使在可用信息有限的情况下也能找到他们想要的内容。允许使用不完整信息进行搜索,可以加快发现速度。
尽管现代的 SQL 和 NoSQL 数据库自带一些全文搜索功能,但与专注于搜索的数据库相比,它们往往力有不足。要深入了解此主题,请考虑阅读关于 [Postgres 在全文搜索方面的不足之处](/blog/postgres-full-text-search-limitations/#vector-search&utm_source=blog&utm_medium=full-text-vs-vector)的文章。
在我们的专属文章中,了解搜索引擎的内部工作原理。
向量搜索
向量搜索是一种由 AI 驱动的搜索方法。它不是寻找与文本查询匹配的文档,而是允许查找具有相似语义含义的文档。这是通过利用大型语言模型(LLMs)提供的文本语义理解来实现的。
LLMs 可以处理数据库记录并生成向量嵌入——文档语义含义的数值表示。这些嵌入随后存储在[向量数据库](/blog/what-is-a-vector-database/#vector-search&utm_source=blog&utm_medium=full-text-vs-vector)中。顾名思义,向量搜索通过比较相似向量来工作。
通过执行向量比较,向量搜索有效地实现了[语义搜索](/blog/what-is-a-vector-database/#vector-search&utm_source=blog&utm_medium=full-text-vs-vector#what-is-similarity-search)。尽管依赖不同的底层技术,但它也解决了与全文搜索类似的目的:通过改善搜索的发现性来赋能用户。它尤其支持多模态搜索——使用非文本输入进行搜索,例如在 Google 图片中。
比较分析:全文搜索 vs 向量搜索
全文搜索通过在文档中查找单词来工作。这使其擅长理解用户查询背后的词汇意图。但当它必须处理无法进行模糊匹配的模糊查询时,就显得力不从心。对文档缺乏语义理解使其无法理解上下文并进行泛化。
总而言之,全文搜索
- ✅ 纠正拼写错误 — 例如:
reutrn of the jedi
- ✅ 处理精确查询 — 例如:
an exact product name
- ✅ 处理不完整查询 — 例如:
return of the j
- ❌ 无法处理模糊查询 — 例如:
folks fighting with lightsabers
- ❌ 无法理解上下文 — 例如:
winter clothes
另一方面,向量搜索通过查找具有相似含义的文档来工作。这使其擅长理解用户查询背后的语义意图。它在理解文档的同义词和描述方面表现出色。它也适用于发现相似文档。
总而言之,向量搜索
- ✅ 处理模糊查询 — 例如:first released star wars movie
- ✅ 理解上下文 — 例如:winter clothes
- ✅ 可以推荐相似文档
- ❌ 无法处理精确查询
- 👎 需要更多资源
正如我们所见,两种解决方案都并非完美。它们各自在特定用例中都有明显的优势。它们相互补充。构建最先进的搜索体验将需要结合全文搜索和向量搜索的优势。
那么,我们能两者兼得吗?
混合搜索的优势
混合搜索结合了全文搜索和向量搜索的优势。它建立在全文搜索易于访问的即时搜索体验之上,并整合了 AI 搜索所带来的增强发现能力。
像 Meilisearch 的混合搜索这样的解决方案,在不妥协的情况下实现了两者的最佳结合。这使得开发者可以使用统一的 API 进行所有类型的搜索。下面的代码示例演示了这种 API 的用法。
// Hybrid search with Meilisearch const results = await client.multiSearch({ queries: [{ indexUid: 'movies', q: 'batman', hybrid: { embedder: 'default', semanticRatio: 0.5 } }] })
不使用 JavaScript?Meilisearch 支持多种 SDK。
这段代码使用 Meilisearch 客户端在电影索引中搜索查询 batman
。它使用混合搜索,通过 hybrid
参数进行配置。让我们回顾一下 hybrid
对象中的字段,看看它们实现了什么功能。
embedder
字段允许选择哪个嵌入器将处理查询(Meilisearch 允许为给定索引配置多个嵌入器)。
semanticRatio
字段允许我们平衡来自语义搜索结果的重要性。值越高,将允许在[语义空间](/blog/what-are-vector-embeddings/#vector-search&utm_source=blog&utm_medium=full-text-vs-vector#what-is-the-semantic-space)中距离更远的文档出现在最终搜索结果中。
semanticRatio
值的含义如下:
- 语义比率 = 0 — 这是全文搜索
- 语义比率 = 1 — 这是向量搜索
- 0 < 语义比率 < 1 — 这是混合搜索 ✨
由于语义搜索总是会返回一些文档,因此,找到一个好的平衡点以保持整体搜索结果的相关性非常重要。下面的演示允许您搜索电影并调整语义比率,以查看它如何影响结果。
搜索“green ogre in fairy tale parody”(在线演示)
更新:混合搜索现已在 Meilisearch Cloud 上全面可用。
结论
正如工程师们会告诉您的,“哪个工具最适合 X?”这个问题,答案总是:视情况而定。就其本身而言,无论是全文搜索还是向量搜索,都无法满足构建快速、相关搜索体验的所有标准。混合搜索将全文搜索的易用性与 AI 带来的改进发现能力相结合。
混合搜索是现代的搜索方法,在一个 API 后统一了最先进的搜索功能。这种混合方法将全文搜索与语义搜索融合,提升了搜索结果的准确性和全面性。它是一种现代、灵活的解决方案,适用于当今的搜索用例。
Meilisearch 是一款开源搜索引擎,使开发者能够构建最先进的体验,同时享受简单、直观的开发者体验(DX)。
更多关于 Meilisearch 的信息,您可以加入Discord社区或订阅新闻简报。您可以通过查看其路线图并参与产品讨论来了解更多关于该产品的信息。