paint-brush
我们使用 Algolia 和 NodeJS 构建可搜索索引的旅程经过@algolia
356 讀數
356 讀數

我们使用 Algolia 和 NodeJS 构建可搜索索引的旅程

经过 Algolia4m2023/04/11
Read on Terminal Reader

太長; 讀書

我与 Starschema 全栈工程师 Soma Osvay 合作编写了一个我最喜欢的项目:开发人员文档。我们需要能够搜索与特定主题相关的项目以检查实现细节、从代码中获取想法等等。 Soma 和我都希望您喜欢这篇文章,我们介绍了用例和挑战以及 Soma 提出的实现。
featured image - 我们使用 Algolia 和 NodeJS 构建可搜索索引的旅程
Algolia HackerNoon profile picture

我与 Starschema 全栈工程师 Soma Osvay 合作编写了一个我最喜欢的项目:开发人员文档。 Soma 和我都希望您喜欢这篇文章,我们介绍了用例和挑战以及 Soma 提出的实现。


在 Starschema,我们已经完成了很多项目,作为对markdown 文档的咨询的一部分。当我们支持这些现有的解决方案或想要开发一个新项目时,我们通常想要搜索所有的文档。我们目前没有解决方案,因为我们必须手动完成这项工作,所以需要花费我们的工时。

用例

我们需要能够搜索与特定主题相关的项目以检查实现细节、从代码中获取想法等等。销售团队还需要一个解决方案来确定我们的团队针对某些主题完成了什么样的项目,并能够快速将其反馈给潜在客户。


为我们的开发人员提供内部 Stack Overflow 之类的东西也很棒,因为我们在 Tableau 中做了大量深入的技术工作。项目经理还需要能够确定哪些员工使用过某些技术,以便他们能够快速轻松地回答问题。


简而言之,我们需要能够根据以下属性搜索自己的项目:


  1. 使用的技术(编码语言、数据库等)
  2. 项目关键字(标签)
  3. 项目文档本身,例如安装说明、技术文档等。
  4. 项目发生的时间范围


所有这些属性都存在于内部文档降价文件中——我们只需要一种方法来搜索它们。

实施计划

计划是使用NodeJS CLI作为概念证明,它将:


  1. 抓取顶级 GitHub 公共存储库并获取 README markdown 文件(最终将代表我们的内部项目)
  2. 将文档文件与项目的基本信息(标题、编程语言、标签等)一起存储到 Algolia


CLI 将包含高级日志记录和命令行参数以便于使用。我们还想将其托管在网络上,以便人们可以试用。

挑战

手头最大的挑战是记录大小——Algolia 只允许我们的记录最多为 100KB。但是,大多数降价文档文件要大得多。解决方案是我们需要在 Index 中将 markdown 文件拆分成多个部分。然后,我们还需要确保当我们搜索某物时,单个项目只出现一次——即使它被分成多个记录。


幸运的是,Algolia 有一个鲜明的特点,所以我们可以很容易地对这些结果进行去重。

索引器实现

为了尽可能简单地使用 Indexer,我选择为它创建一个 CLI,如上所述。提供所需参数后,该工具将自动初始化存储库、删除任何现有记录并配置相关性设置。


为该工具提供支持的是一个简单的 GitHub API,它获取请求数量的顶级存储库并提取它们的所有元数据并下载 README 文件。它还会过滤掉缺少所有者或缺少 README 文件的存储库,从而为我们提供最佳结果。最后,它还会将 markdown 内容转换为 HTML,以便于在前端呈现。


为了控制记录大小,该工具会自动将超过 5 万个字符的自述文件拆分为额外的记录。这样记录不会变得太大,但一条记录仍应为几乎所有存储库服务。然后它会一次将此信息同步到 Algolia 100 条记录,以便我们可以满足他们文档中描述的批处理建议。

前端实现

作为我的起点,我利用了 Algolia 发布的create-instantsearch-app库并启动了一个 InstantSearch.js 样板。从这里,我能够添加 InstantSearch.js 提供的其他小部件,例如效果很好的分页和页面大小选择器。


由于我们还使用 markdown 收集存储库元数据,因此我们还需要自定义命中组件以包含此附加信息。通常,元数据与库描述一样重要,因此开发人员可以一眼看出它是否是一个流行的库、谁发布了它、标签等等。我还添加了分面,以便用户可以按编程语言、标签或分叉次数进行过滤。


难题的最后一部分是添加“打开文档”按钮,使您可以在弹出窗口中快速轻松地阅读存储库的降价内容,而无需离开应用程序。如果我们点击的记录有多行,它会自动加载额外的记录并在显示中连接它们——太棒了!

结论

这个项目是一个有趣的测试,它真正向我展示了 Algolia 对于像我们这样的不同用例的灵活性。准备就绪的小部件在原型制作过程中为我节省了大量时间,并且从最初的几次击键中获得相关结果令人印象深刻。我还认为,如果我们能够从用户内部点击项目中生成足够的事件,那么如果我们能够利用 Algolia Recommend 的强大功能,那将会非常有趣。


您可以在此处查看 GitHub 测试项目的现场演示,其中包含一个按钮,可以使用默认演示凭据设置您以查看我们的索引。对后端索引代码感兴趣?你可以在 GitHub找到它!



也发布在这里。