菜单

搜索实现

相关源文件

本文档详细介绍了 30 Seconds of Code 代码库中的搜索实现。它涵盖了内容如何被索引、搜索和排名,以便为用户提供准确的搜索结果。有关文档如何准备索引的信息,请参阅 文档索引

概述

30 Seconds of Code 中的搜索系统提供快速的客户端搜索功能,并支持模糊匹配。它使用倒排索引架构来实现高效的词语查找,并使用 n-gram 索引来实现模糊搜索功能。该系统处理内容存储库中的代码片段和集合,以使其可搜索。

来源

文档索引结构

搜索系统的基础是 DocumentIndex 类,它维护三个关键数据结构:

  1. 文档映射:存储带有词语、n-gram 和元数据的原始文档。
  2. 倒排索引:将词语映射到包含这些词语的文档及其频率。
  3. N-gram 倒排索引:将 n-gram 映射到文档,用于模糊匹配。

来源

索引过程

索引过程将代码片段和集合转换为可搜索的文档。

  1. 文档是从已发布和列出的代码片段及集合中收集的。
  2. 每个文档包含 ID、词语映射和原始内容词语。
  3. 使用这些文档构建 DocumentIndex
  4. 提取并索引词语和 n-gram。

当文档添加到索引时,它会处理所有词语并生成 n-gram 以进行模糊匹配。

来源

词语处理

词语通过 StringUtils 中的 normalizedTokens 方法从内容中提取,该方法会:

  1. 将文本转换为小写。
  2. 按非字母数字字符拆分。
  3. 过滤掉长度小于 2 个字符的词语。

每个词语都与每个文档中的频率一起存储在倒排索引中,从而实现基于相关性的排名。

来源

N-gram 生成

为了进行模糊匹配,系统会为每个词语生成 n-gram(长度为 n 的字符序列)。这允许匹配与索引词语相似但不完全相同的查询。

在索引文档时,会为每个词语生成 n-gram,并存储在 n-gram 倒排索引中。

这些 n-gram 在搜索时用于查找潜在匹配项,即使搜索词语包含拼写错误或轻微的变体。

来源

搜索查询执行

搜索查询通过 PreparedQueries 中的 searchForTerm 方法进行处理。

该方法会:

  1. 确保文档索引已准备就绪。
  2. 计时搜索执行,用于性能监控。
  3. 调用 search 函数,并传入文档索引。
  4. 将结果映射为包含 ID 和分数的简化格式。

来源

搜索结果排名

搜索结果基于以下因素进行排名:

  1. 词语频率:一个词语在文档中出现的次数。
  2. 词语覆盖率:搜索词语中有多少与文档匹配。
  3. 模糊匹配质量:对于模糊匹配,相似度分数会影响排名。

搜索结果以对象数组的形式返回,每个对象包含文档 ID 和相关性分数,按相关性降序排序。

来源

与构建系统的集成

搜索系统通过 bin/prepare 脚本集成到构建过程中。准备网站内容时:

  1. 内容被处理和准备。
  2. SearchIndex 模块生成搜索索引。
  3. 索引被包含在构建好的网站中,用于客户端搜索。

来源

开发中的使用

搜索功能在开发控制台中可用,用于测试和调试。

这允许开发人员:

  1. 直接访问文档索引。
  2. 测试搜索查询。
  3. 分析词语和 n-gram 的频率。

来源

性能考量

搜索实现包含多项优化:

  1. 预计算索引:索引在构建时生成,而非运行时。
  2. 高效数据结构:使用 Map 和 Set 实现 O(1) 的查找。
  3. 限制结果集:可以限制搜索结果的数量以提高性能。
  4. 性能监控:搜索执行会计时,用于性能跟踪。

这些优化即使在拥有大量文档的情况下也能实现快速的搜索性能。

来源