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