分享到

引言

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

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

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

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

全文搜索通常还包括根据结果与用户查询的相对相似性对结果进行排名和排序的功能。 这可以帮助引擎首先显示最合适的结果,或者取消排名较低的项目,除非明确要求。

索引的重要性

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

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

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

索引是如何创建的

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

然后,标记被处理成 “词位”,即语言级别的意义单位。 在此过程中,术语通常被规范化,以将相关词汇折叠成单个条目,这允许查询引擎返回与字面搜索略有不同的相关结果。

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

平衡索引过程

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

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

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

很多时候,您在索引期间做出的决定会影响您在查询过程中可以获得的搜索结果的质量。 这有时被讨论为在优先考虑召回率和精确率之间取得平衡,这两者都是用于描述搜索有效性不同方面的技术术语。

召回率 是返回的相关结果与数据集内相关结果总数之比。 具有高召回率的查询会检索出可能相关结果的很大一部分。

与此相关的是搜索的 精确率,它描述了返回的结果中有多少实际上是相关的。 具有高精确率的查询结果数量有限,这些结果与给定的查询不太相关。

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

优化索引过程

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

某些系统允许文档作者提供与文档文本相关的关键字列表。 这些可以用作索引器关于单词适当上下文的提示,并且还可以帮助指示文档的预期主要主题。 它们还可以用于帮助索引器区分 同形异义词,即拼写相同但可以具有不同含义的词(例如“刻薄”的人与数字集合的算术“平均值”之间的区别)。

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

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

影响查询引擎

对于大多数全文搜索系统,允许在实际查询过程中表达也是很重要的。 查询界面可以通过许多不同的方式公开这种表达能力。

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

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

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

结论

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

全文搜索是一个非常广泛的主题,其中包含许多细微差别、优化、平衡考虑和实现。 虽然本文并非旨在成为权威资源,但它应该可以作为您继续学习的坚实概念基础。

关于作者
Justin Ellingwood

Justin Ellingwood

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