简介
数据库系统最常见的功能之一是根据给定的查询检索项目。虽然传统的数据库查询非常适合熟悉系统工具和数据结构的用户发出的结构化命令,但大多数向用户公开的搜索功能都使用不同的技术。
在本文中,我们将介绍全文搜索背后的思想。我们将讨论这种类型的文本处理和检索与传统数据库查询有何不同,以及为什么它在许多情况下很有用。我们将探讨您在索引和查询过程中可以做出的一些决策,以影响您检索的结果,并且我们将讨论您在与这些系统交互以获得所需结果时必须做出的一些权衡。
Prisma 数据平台 可以帮助简化生产环境中对数据库的访问。如果您正在使用 Prisma Client 管理数据库连接,则 Prisma 数据平台可以帮助您更轻松地管理生产工作负载。
什么是全文搜索?
全文搜索 是指允许您在数据库系统中搜索文档完整文本的一系列技术的术语。这与仅依赖元数据、部分文本源和其他不完整评估的搜索功能直接相反。
与常规数据库查询相比,全文搜索具有语言感知能力。这意味着它依赖于对存储文档和搜索本身中使用的语言的某种程度的理解,以便检索在语义上 meaningful 的结果。
全文搜索通常还包括根据结果与用户查询的相对相似性对结果进行排名和排序的功能。这可以帮助引擎首先显示最合适的结果,或者取消低排名项目的资格,除非明确请求。
索引的重要性
虽然许多数据库操作可以通过索引来改进,但全文搜索尤其依赖于异步索引过程。
索引是解析现有文档以编译索引的过程。 索引 是一种更小、优化的结构,专门用于快速查找请求的项目。虽然普通数据库索引可能会分析一些字段来创建索引,但全文搜索索引是通过分析文档的完整文本来创建的。
如果没有索引,搜索必须完成一个称为 串行扫描 的过程,系统会在查询时分析每个项目,以查看它们是否符合查询条件。对于那些熟悉类 Unix 系统的人来说,这类似于使用 find
工具(在查询期间扫描文件系统)搜索文件名与更快的 locate
命令之间的区别,后者依赖于定期更新的索引。
索引是如何创建的
索引过程由多个相关阶段组成。首先,文档由解析器扫描,将文本划分为单独的“标记”。 标记 是系统已知的离散词,可以根据其词性、与相似词的关系等进行分类。
然后将标记处理成 “词位”,一种语言级别的意义单位。在此过程中,术语通常被标准化,以将相关词语折叠成单个条目,这允许查询引擎返回与字面搜索略有不同的相关结果。
然后将分析结果排序并存储在优化的索引中,以便查询引擎可以找到相关结果并比较每个文档的不同因素。索引包括有关每个文档中找到的词位的信息,并且可能包括其他上下文,例如位置数据、词位密度等,以帮助实现更复杂的搜索条件。
平衡索引过程
虽然我们讨论了创建全文索引所需的一般步骤,但我们遗漏了一些关键因素,这些因素会影响索引和由此产生的查询功能。索引文本的方法有很多种,您选择这样做的方式会对搜索功能的性能和特性产生很大影响。
几乎所有索引过程都采用的一种优化是使用停用词。 停用词 是指被认为不相关或过于模糊而无法在搜索期间使用的单词列表。它们通常是语言中最常见的词,包含最少的相关上下文。英语中的一些示例包括“the”、“a”和“it”。在索引期间,停用词将从索引中删除,这有助于保持索引更小、更快,以进行更相关的搜索。
如前所述,索引过程也可能将密切相关的条目折叠成单个项目,以保持索引较小,并为相似的查询提供更广泛的结果范围。其中一种技术称为 “词干提取”,它将同一词“词干”的变体词组合在一起。例如,“cook”、“cooking”和“cooked”将组合成一个条目。其他技术可能会查阅语言感知工具(如词库)来映射同义词或识别可能代替单词的短语。
很多时候,您在索引期间做出的决定会影响您在查询过程中可以获得的搜索结果的质量。这有时被讨论为优先考虑召回率和精确度之间的平衡,这两者都是用于描述搜索有效性不同方面的技术术语。
召回率 是指返回的相关结果与数据集内相关结果总数之比。具有高召回率的查询会检索可能相关结果的很大一部分。
与之相关的是搜索的 精确度,它描述了返回的结果中有多少实际上是相关的。具有高精确度的查询具有有限数量的与给定查询不太相关的结果。
像停用词这样的技术可以通过从分析中消除不重要的词来提高结果的精确度。另一方面,词干提取主要通过捕获由于细微的单词差异而导致相关结果丢失的情况来提高召回率。这两个概念会相互影响,因此在构建索引时必须同时考虑这两个概念,以确保您的结果同时具有您期望的相关性和数量。
优化索引过程
除了停用词和词干提取之外,数据库管理员还可以通过其他方式优化索引过程。
某些系统允许文档作者提供与文档文本相关的关键字列表。这些可以用作索引器关于单词适当上下文的提示,并且还可以帮助指示文档的预期主要主题。它们还可以用于帮助索引器区分 同形异义词,即拼写相同但可以具有不同含义的词(例如,“mean”的人和数字集的算术“mean”之间的区别)。
开发人员和管理员还可以指定使用的解析器、词典和标记类型。这些决定了文本在索引过程中的处理、分解和分类方式。切换解析算法或索引模式可以更改创建的索引的结构、其在不同类型查询中的性能以及它在适应复杂查询方面的灵活性。
可能对未来查询产生重大影响的另一个影响点是对文档文本中不同因素进行加权。例如,管理员可以增加文档标题中包含的单词而不是脚注中包含的单词的 “权重” 或相关性。根据系统的不同,这可能相当复杂和富有表现力。例如,您可以在分析文档标题时使用特定于主题的词表,以便根据每个文档为与主题相关的术语分配更高的权重。
影响查询引擎
对于大多数全文搜索系统,在实际查询过程中允许表达性也很重要。查询界面可以通过许多不同的方式公开这种表达性。
提高用户在查询结构化项目期间的控制级别的最简单方法之一是允许按字段搜索。这在非结构化文本中不太相关,但在与元数据结合使用以使用作者、出版日期、标题、类型等字段进行搜索时,可能非常有用。对于可能值较少的字段,可以在界面中直接选择这些字段,而不是可搜索的字段,以提高可用性。
复合查询运算符是全文搜索工具允许用户影响查询引擎的另一种简单方法。这允许用户使用简单的布尔逻辑(如“and”来包含应存在的多个术语,以及“or”来包含替代项)来构造查询。它还可以通过让用户提供不应包含的术语列表、应存在的短语或考虑文本中单词之间邻近关系的查询来启用更复杂的功能。
搜索界面可以影响查询引擎的另一个重要方式是通过启用“严格”查询模式。虽然在常规操作期间包含近似匹配可能很有用,但有时仅搜索给定的确切单词或短语也很有用。允许用户在模糊匹配和精确匹配之间更改查询模式可以提高显示相关结果的可能性。
结论
在本文中,我们讨论了什么是全文搜索,并介绍了它背后的一些核心概念。我们讨论了全文搜索与传统数据库查询之间的区别,解释了为什么索引在这种上下文中至关重要,并回顾了设计搜索索引时可能需要考虑的一些因素。
全文搜索是一个非常广泛的主题,具有许多细微差别、优化、平衡考虑因素和实现方式。虽然本文并非旨在成为权威资源,但它应该可以作为您继续学习的强大概念基础。
Prisma 数据平台 可以帮助简化生产环境中对数据库的访问。如果您正在使用 Prisma Client 管理数据库连接,则 Prisma 数据平台可以帮助您更轻松地管理生产工作负载。