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