本文档详细介绍了 30 Seconds of Code 代码库中的搜索实现。它涵盖了内容如何被索引、搜索和排名,以便为用户提供准确的搜索结果。有关文档如何准备索引的信息,请参阅 文档索引。
30 Seconds of Code 中的搜索系统提供快速的客户端搜索功能,并支持模糊匹配。它使用倒排索引架构来实现高效的词语查找,并使用 n-gram 索引来实现模糊搜索功能。该系统处理内容存储库中的代码片段和集合,以使其可搜索。
来源
搜索系统的基础是 DocumentIndex 类,它维护三个关键数据结构:
来源
索引过程将代码片段和集合转换为可搜索的文档。
DocumentIndex。当文档添加到索引时,它会处理所有词语并生成 n-gram 以进行模糊匹配。
来源
词语通过 StringUtils 中的 normalizedTokens 方法从内容中提取,该方法会:
每个词语都与每个文档中的频率一起存储在倒排索引中,从而实现基于相关性的排名。
来源
为了进行模糊匹配,系统会为每个词语生成 n-gram(长度为 n 的字符序列)。这允许匹配与索引词语相似但不完全相同的查询。
在索引文档时,会为每个词语生成 n-gram,并存储在 n-gram 倒排索引中。
这些 n-gram 在搜索时用于查找潜在匹配项,即使搜索词语包含拼写错误或轻微的变体。
来源
搜索查询通过 PreparedQueries 中的 searchForTerm 方法进行处理。
该方法会:
search 函数,并传入文档索引。来源
搜索结果基于以下因素进行排名:
搜索结果以对象数组的形式返回,每个对象包含文档 ID 和相关性分数,按相关性降序排序。
来源
搜索系统通过 bin/prepare 脚本集成到构建过程中。准备网站内容时:
SearchIndex 模块生成搜索索引。来源
搜索功能在开发控制台中可用,用于测试和调试。
这允许开发人员:
来源
搜索实现包含多项优化:
这些优化即使在拥有大量文档的情况下也能实现快速的搜索性能。
来源