分享到

简介

数据库系统最常见的功能之一是能够根据给定查询检索项目。虽然传统数据库查询非常适合熟悉系统工具和数据结构的用户执行结构化命令,但大多数向用户公开的搜索功能采用不同的技术。

在本文中,我们将介绍全文搜索背后的理念。我们将讨论这种文本处理和检索类型与传统数据库查询有何不同,以及为什么它在许多情况下很有用。我们将探讨在索引和查询过程中可以做出的一些决策,以影响您检索到的结果,并讨论在与这些系统交互时为获得所需结果而必须做出的一些权衡。

全文搜索 是指允许您在数据库系统中搜索文档完整文本的一系列技术。这与仅依赖元数据、部分文本源和其他不完整评估的搜索功能直接相反。

与常规数据库查询相比,全文搜索是语言感知的。这意味着它在一定程度上依赖于对存储文档和搜索本身所用语言的理解,以便检索具有语义意义的结果。

全文搜索通常还包括根据结果与用户查询的相对相似性对结果进行排名和排序的功能。这有助于引擎首先显示最相关的结果,或者在未明确请求的情况下排除排名较低的项目。

索引的重要性

虽然许多数据库操作可以通过索引得到改进,但全文搜索尤其依赖于异步索引过程。

索引是将现有文档解析以编译索引的过程。索引是一种更小、经过优化的结构,专门用于快速查找请求的项目。虽然普通数据库索引可能会分析几个字段来创建索引,但全文搜索索引是通过分析文档的完整文本来创建的。

如果没有索引,搜索必须完成一个称为串行扫描的过程,在该过程中系统在查询时分析每个项目以查看它们是否与查询条件匹配。对于熟悉类 Unix 系统的人来说,这类似于使用 find 工具搜索文件名(该工具在查询期间扫描文件系统)和更快的 locate 命令(该命令依赖于定期更新的索引)之间的区别。

索引是如何创建的

索引过程由多个相关阶段组成。首先,文档由解析器扫描,将文本划分为单个“标记”("tokens")。标记是系统已知的离散词语,可以根据其词性、与相似词的关系等进行分类。

然后,标记被处理成“词位”("lexemes"),这是一个语言级别的意义单元。在此过程中,术语通常会被规范化,将相关词语合并为一个条目,这允许查询引擎返回与字面搜索略有不同的相关结果。

分析结果随后被排序并存储在一个优化的索引中,以便查询引擎能够找到相关结果并比较每个文档的不同因素。该索引包含有关每个文档中发现的词位信息,并可能包括额外的上下文,如位置数据、词位密度等,以帮助实现更复杂的搜索条件。

平衡索引过程

虽然我们讨论了创建全文索引所需的一般步骤,但我们遗漏了一些影响索引和最终查询功能的关键因素。索引文本的方式有很多种,您选择的方式会对搜索功能的性能和特性产生重大影响。

几乎所有索引过程都采用的一项优化是使用停用词。停用词是被认为无关紧要或过于模糊而无法在搜索中有用的词语列表。它们通常是语言中最常见的词语,包含最少的相关上下文。英语中的一些例子包括 "the"、"a" 和 "it"。在索引期间,停用词会从索引中删除,这有助于保持索引更小,并为更相关的搜索提供更快的速度。

如前所述,索引过程还可能将密切相关的条目合并为单个项目,以保持索引较小,并为相似查询提供更广泛的结果。其中一种技术称为“词干提取”("stemming"),它将同一单词“词干”的不同变体词语组合在一起。例如,“cook”、“cooking”和“cooked”将被合并为一个条目。其他技术可能会查阅语言感知工具,如同义词库,以映射同义词或识别可能替代某个单词的短语。

在许多情况下,您在索引过程中做出的决策会影响在查询过程中获得的搜索结果质量。这有时被讨论为召回率和精确度之间的平衡,两者都是用于描述搜索效果不同方面的技术术语。

召回率(Recall)是返回的相关结果与数据集中相关结果总数之比。高召回率的查询会检索到大部分可能的 A相关结果。

与此相关的是搜索的精确度(precision),它描述了返回结果中有多少是实际相关的。高精确度的查询其结果中与给定查询不太相关的数量有限。

停用词等技术可以通过从分析中消除不重要的词语来提高结果的精确度。另一方面,词干提取主要通过捕获因微小词语差异而可能丢失相关结果的情况来提高召回率。这两个概念可以相互影响,因此在构建索引时必须同时考虑它们,以确保您的结果既具有相关性又具有您希望的数量。

优化索引过程

除了停用词和词干提取之外,数据库管理员还可以通过其他方式优化索引过程。

一些系统允许文档作者随文档文本提供相关关键词列表。这些关键词可以作为索引器判断词语适当上下文的提示,也有助于确定文档的预期主要主题。它们还可以用于帮助索引器区分同形异义词,即拼写相同但含义不同的词语(例如“mean”指“刻薄的人”和“mean”指“算术平均值”的区别)。

开发人员和管理员还可以指定使用的解析器、字典和标记类型。这些决定了文本在索引过程中如何处理、分解和分类。更换解析算法或索引模式可以改变创建的索引结构、其在不同类型查询下的性能以及它在适应复杂查询方面的灵活性。

另一个对未来查询影响很大的影响点是权衡文档文本中的不同因素。例如,管理员可以为文档标题中包含的词语(而不是其脚注中的词语)分配更高的“权重”或相关性。根据系统不同,这可能相当复杂和富有表现力。例如,您可以在分析文档标题时使用特定主题的词语列表,为与该主题相关的术语在每个文档的基础上分配更高的权重。

影响查询引擎

对于大多数全文搜索系统来说,在实际查询过程中允许表达性也很重要。查询界面可以通过多种不同方式展现这种表达性。

增加用户在查询结构化项目时控制级别最简单的方法之一是允许按字段搜索。这在非结构化文本中不太相关,但与元数据结合使用时,通过作者、出版日期、标题、类型等字段进行搜索会非常有用。对于可能值数量较少的字段,可以直接在界面中选择它们,而不是进行搜索,以提高可用性。

复合查询运算符是全文搜索工具允许用户影响查询引擎的另一种简单方式。这使用户能够使用简单的布尔逻辑(如“and”用于包含必须存在的多个术语,“or”用于包含替代项)来构建查询。它还可以通过允许用户提供不应包含的术语列表、必须存在的短语或考虑文本中单词之间邻近度的查询来实现更复杂的功能。

搜索界面影响查询引擎的另一个重要方式是启用“严格”查询模式。虽然在常规操作中包含近似匹配可能很有用,但有时只搜索给定的精确单词或短语会更有帮助。允许用户在模糊匹配和精确匹配之间切换查询模式会增加显示相关结果的可能性。

结论

在本文中,我们讨论了什么是全文搜索,并介绍了一些其背后的核心概念。我们讨论了全文搜索与传统数据库查询之间的区别,解释了为什么索引在此上下文中至关重要,并回顾了在设计搜索索引时可能需要考虑的一些因素。

全文搜索是一个极其广泛的主题,包含许多细微差别、优化、平衡考量和实现。虽然本文并非旨在成为一个权威资源,但它希望能为您在持续学习中奠定坚实的理念基础。

关于作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以来一直撰写关于数据库、Linux、基础设施和开发工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。
© . All rights reserved.