什么是全文搜索,它是如何工作的?
了解什么是全文搜索、它的优势、不同类型以及众多用例。探索这些搜索引擎实际的工作原理。

全文搜索能从海量文本中提供即时、准确的结果。
它是一个强大的工具,用于查询基于文本的信息,具有快速检索和高相关性的特点。它还能改善用户体验。
Meilisearch 广泛应用于电子商务、内容管理系统和法律研究领域,它通过对文本进行分词并使用 LMDB 有效存储来创建索引。
它使用基于容错、邻近度和词语匹配规则的可配置相关性算法对结果进行排名。
好奇它是如何工作的以及为什么重要吗?本文将为您解释。
什么是全文搜索?
全文搜索是一种强大的搜索技术,它在整个文本文档或数据集中搜索用户查询。它就像一个超级智能的图书管理员,可以即时扫描图书馆里每本书的每一页,并准确地找到您需要的内容。
与特定的关键词匹配算法不同,全文搜索会解析整个文档——无论是单个文档还是(如果来自数据库)多个文档——并找到所有与用户搜索匹配的相关实例。
它会深入搜索传统上可能不会被搜索的文档和文档部分,包括产品描述、参考文献和补充材料。一旦解析完成,它会将每个部分的每个单词编入目录并存储,使其可供搜索。
全文搜索有哪些优势?
全文搜索为用户和系统都提供了显著优势。例如,它
- 提供高速查询性能通过在毫秒级时间内从大型数据集中检索结果。此外,它还分析一组文档中的所有单词并对其进行索引,以实现更快的信息检索。
- 增强用户可访问性通过适应自然语言查询、拼写错误和同义词。因此,它为用户查询提供了直观且用户友好的解决方案。
- 提高结果的相关性和准确性相较于传统搜索方法。它通过排名算法实现这一点,这些算法根据上下文意义(如神经搜索中所示)和语义相似性而非单纯的词语出现频率来优先匹配。
这些优势使其在从电子商务到文档管理等各种应用中都具有无可估量的价值。
全文搜索的不同类型有哪些?
全文搜索包含多种方法,每种方法都针对特定的需求。以下是主要类型概述
基本搜索 | 在所有文档中搜索精确的单词匹配,例如“apple”。然后,它返回所有包含单词“apple”的文档。它效率高且节省计算能力,但对于复杂查询缺乏精确性。 |
通配符搜索 | 使用符号(例如,“appl*”)来匹配“apply”或“application”等变体。虽然适用于不完整的输入,但可能会引入不相关结果,例如在需要“apply”的变体时返回“apple”。 |
模糊搜索 | 使用相似性算法容忍错误(例如,“appel”匹配“apple”)和相似的变体(例如,“apple”和“apples”)。它非常适合纠正拼写错误或捕获略有差异的结果,例如美式英语和英式英语之间的差异。 |
短语搜索 | 此方法要求精确的序列(例如,带引号的“red apple”)以确保精确的上下文匹配。在搜索特定顺序的精确词串时非常有用。 |
布尔搜索 | 结合运算符(例如,“apple AND orange NOT banana”)以精确控制结果。它结合了多个搜索字段并缩小了搜索范围,以获得更全面但更具体的结果。 |
邻近搜索 | 指定词语距离(例如,“apple orange” ~5,“apple NEAR orange”)以捕获定义范围内的上下文关系。当特定词语预计会紧密出现时,这尤其有用,可以从文档中提取最相关的信息。 |
分面搜索 | 允许从主题的不同方面(例如,“水果”通过“黄色”或“柑橘”进行细化)进行筛选,以精细控制搜索结果。它广泛用于查询具有用户可能正在寻找的特定属性的结构化数据集。 |
范围搜索 | 此搜索针对数值(例如,价格:4-20)、字母(例如,尺码:S-M)或时间范围(例如,日期:04/02/24-10/02/25)以检索用户指定范围内的结果。因此,它对于定量筛选特别有效。 |
每种方法,通常集成在 Meilisearch 等工具中,都能满足多样化但独特的搜索需求。
这种能力在现实世界中体现在哪里?让我们来看一下这些功能的一些实际应用。
全文搜索的不同用例有哪些?
全文搜索支持广泛的行业、功能和应用。
电子商务搜索 | 通过索引产品描述、规格和评论来促进产品发现。 | 对于“防水登山靴”等精确查询 |
文档管理系统 | 增强从大量 PDF、Word 文件和其他文本格式中检索的能力。 | 用于访问特定新闻报道等关键信息。 |
客户支持与帮助中心 | 通过索引常见问题、文章和故障排除指南,实现快速问题解决。 | 用于使用“修复登录错误”等查询来查找解决方案。 |
医学与法律研究 | 加速在海量数据中分析判例法、医疗记录和研究论文。 | 用于获取交通事故案例的先例。 |
社交媒体与内容平台 | 通过使用文本、字幕和元数据,改进新闻网站、博客页面和视频平台的内容索引。 | 用于更好地发现趋势,例如,焦糖咖啡。 |
这些应用展示了全文搜索如何成为高效、多功能信息检索的支柱。
那么,它是如何从原始数据变为可搜索结果的呢?让我们探讨全文搜索的索引功能。
全文搜索是如何工作的?
在现代搜索引擎中,全文搜索是一个复杂的多步骤过程。其主要目标是相关性和速度,在此我们将快速概述其工作原理。
在许多搜索系统中,第一步是抓取或摄取要搜索的内容。这可以通过机器人、直接上传文件或通过 API 和数据库来实现。方法的具体组合将取决于用例。例如,谷歌依靠爬虫,而公司的内部搜索引擎主要使用数据库或直接摄取文件。
在此之后,文本需要进行处理和规范化。分词(稍后详细介绍)、小写转换、停用词移除和词干提取等技术可确保文本干净和标准化,从而避免因文本中的细微差异(例如单词的大小写)而错过相关结果。
接下来是倒排索引,您可以将其视为整个过程的核心。它是一种将术语映射到它们出现的文档的数据结构。
“coffee” → [Doc1, Doc3, Doc5]
“beans” → [Doc3, Doc4]
倒排索引允许快速查找哪些文档包含给定的搜索词,而无需扫描每个文档的全部内容。
除了术语,索引还可以存储术语位置(对短语搜索有用)、频率数据(术语在文档中出现的频率)以及元数据,例如标题、标签等。
现在,我们进入用户开始搜索的阶段。查询处理要求系统以与倒排索引相同的方式对用户查询进行分词和规范化。此阶段还可以添加用户意图增强功能,例如同义词匹配。
最后,一旦找到匹配项,便进入评分和排名阶段。由于并非所有匹配项都同样相关,搜索引擎会使用算法根据相关性对结果进行排名和排序。
TF-IDF(词频-逆文档频率)和 BM25(受 TF-IDF 启发但使用概率模型)是排序结果的“经典”方法。现代技术包括基于向量的搜索(语义搜索),它将查询和文档转换为数值向量,以根据含义而非关键词进行匹配。
现在我们大致了解了全文搜索的工作原理,接下来我们将以 Meilisearch 为例,深入探讨其各个阶段和技术。
深入探讨 Meilisearch 的全文搜索过程
索引将原始数据转换为可搜索的格式,这是全文搜索中的关键一步。Meilisearch 通过结构化方法优化此过程,因此值得了解其原理。
我们将逐步向您介绍 Meilisearch 如何处理这些过程。
高性能存储引擎
Meilisearch 采用一种基于记录的定制存储引擎,这些记录被称为“文档”,并被分组为称为“索引”的集合,旨在实现效率和可扩展性。
在幕后,Meilisearch 使用 LMDB(Lightning Memory-Mapped Database)键值存储,它能处理从小型集合到数百万条记录的数据集,并将其存储为键值对的集合。这种存储配置可保持低内存使用、快速访问时间和高性能,以提供最佳用户体验。
例如,LMDB 通过一次只允许一个写入进程来避免同步相关问题。这使其能够为用户提供对最新、一致数据的快速访问。
然而,Meilisearch 在键值存储介入之前,会通过分词对数据进行预处理。
从词语到标记
原始文本,例如产品描述,并不会直接倾倒到数据库中。它首先被分段成标记:小的可搜索单元——这是分词的第一个过程。
为此,Meilisearch 使用(并维护)了名为 Charabia 的开源分词器。Charabia 允许用户配置他们希望可搜索并随后进行分词的字段。
分词的第二步是规范化,或者更简单地说,是基于规则的组织。由于每种语言都有其特殊性,这是一项高度依赖语言的任务,其中单词可能被小写化,并且重音符号等变音符号被移除。
在以下示例中,“Le café de Nicolas”被分段为“le”、“cafe”、“de”和“nicolas”。Meilisearch 还会去除噪音(例如“the”等停用词),并规范化术语(例如从“Le café de Nicolas”变为“le cafe de nicolas”),使其更易于分类。
分段和规范化共同通过使用适当的数据结构组织标记,使搜索更智能、更快、更少字面化。
存储标记
一旦分词,这些单个标记就需要一个归宿。像 Meilisearch 这样的现代全文搜索引擎依靠巧妙的数据结构来实现高效存储和快速检索。
每项功能,如前缀搜索、容错和地理搜索,都有其优缺点。因此,我们的团队精心关注并选择了最适合我们搜索引擎的功能,同时不牺牲速度。
现在让我们一窥驱动 Meilisearch 的数据结构。
倒排索引
倒排索引是核心技巧。倒排索引将标记映射到它们所在的文档以及它们在这些文档中的位置。请参阅下图,了解它如何将单词“alice”、“hello”和“word”映射到相应的文档。
它之所以快速,正如其名称所示,它颠倒了通常的文档到单词的查找方式。由于它只存储一次单词并将其与文档关联起来,因此它们出现在倒排索引中,并且它无需浏览每个文档来查找搜索到的单词。
Meilisearch 为每个文档索引创建近 20 个倒排索引,使其成为最常使用的数据结构之一。然而,为了提供“边打边搜”的体验,引擎需要在索引期间进行大量预处理并定义搜索模式,包括单词前缀、可过滤属性等。
Roaring 位图
Meilisearch 使用 Roaring 位图来压缩与每个标记关联的文档 ID 列表。它们占用内存极小但查询速度快,非常适合扩展到大型数据集。
此外,它们存储大量的整数集合,并执行诸如并集、交集和差集等集合操作。这些操作通过根据文档之间的相互关系来选择文档,从而帮助优化搜索结果。
有限状态换能器
有限状态换能器(FST)以紧凑的、依赖于字符串的方式存储标记前缀和变体。它们表示一系列状态,字符串按升序词典(字母或数字)顺序排列。由于其紧凑性,它们是倒排索引的更小、更快的替代方案。
FST 有时被称为词典,因为它包含数据集中的所有索引词。Meilisearch 使用两个主要的 FST:一个用于存储数据集中的所有单词,另一个用于存储最常见的前缀。
Meilisearch 对 FST 的依赖使其能够支持压缩和延迟解压缩技术,同时以最小的开销处理通配符或自动补全。这包括通过使用类似正则表达式的自动机来检索匹配特定语法规则或模式(例如前缀)的单词子集。
R树
R树管理空间或基于范围的数据,例如坐标或数值,为 Meilisearch 的地理搜索功能提供支持。
为了优化“5英里范围内的餐馆”等全文搜索查询,R树将地理坐标与相关文档标识符关联起来。这允许用户在特定区域内查找附近点或与其它空间对象相交的点。
总之,这些组件使索引快速而灵活。但是当您点击“搜索”时会发生什么呢?下一节将精确地说明搜索词在搜索时是如何处理的。
搜索时:查询处理
索引奠定基础;查询处理才是核心。当您输入查询时,Meilisearch 不会只是返回随机匹配项;它会进行审慎而精确的处理。
现代搜索体验只需您开始输入即可获得结果。为了实现这种“边打边搜”的体验,Meilisearch 会预先计算最常见的前缀列表,以便立即生成结果。
为了容错,Meilisearch 将 FST 与 Levenshtein 算法结合使用。该算法计算 Levenshtein 距离,即将一个字符串转换为另一个字符串的“成本”。换句话说,它量化了一个单词转换为另一个单词所需的转换次数。
例如,转换形式可以是
- 插入,例如,hat -> chat
- 删除,例如,tiger -> tier
- 替换,例如,cat -> hat
- 转置或交换,例如,scared -> sacred
FST 在用户指定的编辑距离内生成单词的所有可能变体。因此,它们使搜索引擎能够准确计算 Levenshtein 距离,并通过将用户输入与“有效”单词字典进行比较来检测拼写错误。
在处理搜索请求时,会考虑用户是否已完成输入,或者查询是否存在任何拼写错误等问题。
查询图
每次收到搜索查询时,Meilisearch 都会将其解析为一种图结构,该结构勾勒出术语及其关系。这种结构使 Meilisearch 能够规划获取结果的最快方式。
例如,查询“the sun flower”被拆分为“the”、“sun”和“flower”,并通过逻辑连接(例如 AND)引导搜索路径。此外,它可能通过以下方式转换:
- 连接:the sunflower
- 替换:the sun flowed
- 添加:the sun flowers
更复杂的查询,例如“the sun flower is facing the su”,将以更扩展的方式处理(图片由我们由 D2 驱动的内部调试工具提供)
如上所示,该图表示搜索查询的不同变体。引擎会预先计算查询中每个术语的单词变体(及其 Levenshtein 距离)。此外,它还会判断查询中的最后一个术语是否为前缀(即其后没有空格),以便调用前缀数据库。
现在您有了查询图,该如何处理呢?
在筛选阶段,Meilisearch 将潜在结果缩小到索引过程中生成的符合筛选条件的文档 ID。
接下来,它使用查询术语及其查询图变体,并在 FST 中搜索匹配的单词。如果该单词被视为前缀,它也会在前缀 FST 中查找。它在倒排索引中搜索它们以检索相应的文档 ID。
最后,引擎执行交集操作,以识别同时包含查询图中单词并满足筛选条件的文档。
让我们举一个例子来更好地理解查询处理。假设您有一个歌曲数据集,用户搜索“约翰·列侬”。用户希望只检索约翰·列侬在 1957 年至 1975 年间发行的歌曲。
首先,Meilisearch 会检索该时间段内歌曲的文档 ID。在确保查询图中的词语存在于 FST 中后,Meilisearch 会检索包含约翰、列侬或两者的文档 ID。它还会检索可能的变体,但为简化起见,此处省略。
最后,只考虑两组文档 ID 的重叠部分(子集)。这意味着只保留同时出现在两组中的文档 ID。换句话说,Meilisearch 保留了在 1957 年至 1975 年间发行且包含约翰、列侬或两者的歌曲的文档 ID。
但是,当大量文档都匹配搜索查询时会发生什么呢?引擎如何决定哪个更相关,从而将其作为第一个搜索结果呢?
这就是相关性计算发挥作用的地方。
相关性
并非所有匹配都相同。单词变体,例如 John Lebon,也可能出现。这就是 Meilisearch 使用词频(“John”出现的频率)、邻近度(“John”和“Lennon”是否接近?)和字段权重(标题优先级高于正文)等因素对搜索结果进行排名的原因。
它经过调整,旨在提供直观感受,使最佳内容置于顶部。这种智能解析和排名的结合使搜索快速而精确。
Meilisearch 使用桶排序对搜索结果中的文档进行排序。该算法允许根据一组规则对文档进行排名。默认情况下,Meilisearch 按以下顺序优先处理规则:
- 匹配词数量:包含所有查询词的文档排名第一
- 拼写错误数量:拼写错误较少的查询词匹配文档排名第一
- 匹配查询词之间的邻近度:查询词紧密排列且与查询字符串顺序一致的文档排名第一
- 查询词在属性中的出现和位置:在更重要属性中包含查询词且位于属性开头的文档排名第一
- 用户定义参数:满足查询时用户设定条件的文档排名第一
- 关键词匹配:与查询匹配的词语数量更多的文档排名第一
Meilisearch 顺序应用这些规则,逐步对结果进行排序。如果两个文档在应用一条规则后仍然并列,它会使用下一条规则来打破平局。
请注意,这些规则是完全可定制的,这意味着您可以根据需要添加、删除和重新排序。更多信息请参阅相关性文档。
默认情况下,Meilisearch 每次搜索最多返回 1000 份文档。但是,它优先提供最相关的结果,而不是所有匹配的结果。通过这种方式,Meilisearch 优先考虑效率和精确度而非详尽结果,以确保优化的搜索体验。
常见问题 (FAQs)
全文搜索与关键词搜索相比如何?
全文搜索会扫描整个文档以查找匹配项,并理解语义上下文和相关性。另一方面,传统的关键词搜索只在特定字段中查找精确的术语,忽略任何其他相关实例。因此,全文搜索提供了更大的深度、适应性和精妙性,使其非常适合自然语言查询。
全文搜索有哪些缺点?
全文搜索在索引时需要大量的存储和计算资源,使其成为资源密集型。如果没有优化,它可能会缓慢处理复杂查询或返回相关性较低、有时甚至是虚假的结果。
有哪些流行的全文搜索引擎?
Meilisearch 是一个流行的选项,可提供快速、用户友好的搜索功能。其他包括 Elasticsearch(强大但复杂)、Solr(专注于企业)和 Algolia(优化易用性)。
全文搜索与向量搜索相比如何?
全文搜索侧重于文本数据集中的文本匹配和关键词相关性,而向量搜索则使用机器学习来识别语义相似性。虽然它们各自都很强大,但它们服务于不同但互补的目的。
全文搜索的替代方案有哪些?
全文搜索的一种替代方案是向量搜索,它针对基于含义的检索。其他选项包括用于结构化数据类型的 SQL 查询和处理小规模模式匹配的正则表达式。每种方法都适用于特定的用例,因此适用于一种应用程序的可能不适用于另一种。
使用全文搜索提供最佳结果
全文搜索是一种强大的搜索机制,用于访问和管理海量文本数据。其速度、灵活性和相关性支持从电子商务到研究等各种应用。
Meilisearch 通过高效索引和复杂的查询处理进一步提升了其功能。它不仅仅是找到东西;它更是要快速找到正确的东西。倒排索引和相关性算法等结构有助于无论是对文本进行分词还是对结果进行排名。