用于您的数字足迹的 Unix 风格的个人搜索引擎和网络爬虫

2021-07-27 00:18:52

Apollo 是一种不同类型的搜索引擎。传统的搜索引擎(如 Google)非常适合在您尝试查找问题的答案时进行发现,但您不知道自己在寻找什么。然而,当你以前在互联网上的某个地方看到过一些东西但不记得在哪里时,他们的回忆和综合能力很差。试图找到它变成了一场噩梦——当你甚至忘记了它在哪里时,你怎么能在互联网上合成这些伟大的材料?我浪费了一个小时来浏览谷歌和我的搜索历史来查找一篇好文章、博客文章,或者只是我以前看过的东西。即使有内置系统来存储我最喜欢的一些文章、播客和其他东西,我也总是忘记事情。螺丝在大海捞针中找针。让我们创建一种新型搜索来选择您要寻找的宝石 Apollo 是一个搜索引擎和网络爬虫,可以消化您的数字足迹。这意味着您可以选择放入其中的内容。当您遇到看起来很有趣的东西时,无论是文章、博客文章、网站,还是其他任何东西,您都可以手动添加它(使用内置系统可以轻松完成)。如果您总是想从某个数据源中提取数据,例如您的笔记或其他东西,您也可以这样做。这解决了返回大量不相关信息的搜索引擎中最大的召回问题之一,因为使用 Apollo,信噪比非常高。您已经选择了要放入其中的内容。 Apollo 不一定是为原始发现而构建的(尽管它肯定与重新发现相匹配),它是为知识压缩和转换而构建的 - 即查找您以前认为很酷的东西 您可能会注意到的第一件事是该设计让人想起旧的数字计算机时代,回到 Unix 时代。这是有意为之的原因有很多。除了向过去的伟人致敬之外,这种设计让我觉得我正在寻找真正属于我自己的东西。当我寻找东西时,我真的觉得我正在穿越过去。

Apollo 的客户端是用 Poseidon 编写的。客户端通过类似 REST 的 API 与后端交互,该 API 提供用于搜索数据和添加新条目的端点。后端是用 Go 编写的,由几个重要组件组成 在搜索查询和在数据上构建倒排索引时使用的分词器和词干分析器 实际的搜索引擎接受查询、分词和词干,找到相关结果从使用这些词干标记的倒排索引然后使用 TF-IDF 对结果进行排名 一个从几个不同来源提取数据的包 - 如果您想从自定义数据源提取数据,您应该在此处添加它。我们使用两种模式,一种首先将数据解析为某种编码格式。这不会被存储,它纯粹是在我们将其转换为倒排索引记录之前的中间体。为什么这很重要?因为由于任何数据都被解析为这种标准化格式,所以您可以链接您想要的任何数据源,如果您构建自己的工具,如果您在某个现有工具中存储大量数据,则不必手动添加所有内容。您可以从任何数据源中提取数据,前提是您以这种格式提供 API 数据。

type Data struct { title string //记录的标题,不言自明的链接字符串 //链接到记录的来源,例如博客文章、网站、播客等内容字符串 //记录的实际内容,必须be text data tags [] string //您要添加的潜在高级文档标签列表,除了包含的原始数据之外,这些标签将被编入索引 } //我们存储在数据库中的最小数据单元 //this将在我们的搜索引擎中存储每个“项目”以及所有必要的信息 //对于倒排索引类型 Record struct { //唯一标识符 ID 字符串 `json:"id"` //title 标题字符串 `json:"title" ` // 可能的源链接(如果适用) 链接字符串 `json:"link"` // 要在结果页面上显示的文本内容 内容字符串 `json:"content"` // 标记到其频率的映射 TokenFrequency map[ string] int `json:"tokenFrequency"`} 数据有多种形式,这些形式越多样化,编写可靠的软件来处理它就越困难。如果我想索引的所有东西都只是我写的东西,生活就会很简单。我所有的笔记可能都放在一个地方,所以我只需要从那个数据源中获取数据并冷静下来 问题是我没有做很多笔记,并不是我想要索引的所有东西都是我想要的记下。 Apollo 不能处理所有类型的数据,它不是设计用来处理的。然而,在构建搜索引擎来索引内容时,我关注了几件事: 来自特定平台的任何数据都可以集成。例如,如果你想索引你的所有 Twitter 数据,这是可能的,因为所有数据都可以以固定格式吸收,转换为兼容的阿波罗格式,然后发送。因此可以轻松集成数据源,这是通过设计以防我想从个人工具中提取数据。更难的事情是,我称之为“在互联网上写作”。我在互联网上阅读了很多东西,其中大部分我希望能够索引,而不必因为我懒惰而必须对我阅读的所有内容做笔记。梦想是能够删除一个链接并让 Apollo 智能地尝试获取内容,然后我就可以对其进行索引,而无需前往帖子并复制内容,这会很痛苦且速度太慢。这是一个项目的网络爬虫组件的大动机

如果是在网上写的,应该可以发链接和自动填充密码 如果你想从自定义数据源中提取数据,将它作为文件添加到 pkg/apollo/sources 文件夹中,遵循与一些相同的规则示例并确保将其添加到此包中 source.go 文件的 GetData() 方法中 本地记录和来自数据源的数据存储在单独的 JSON 文件中。这是为了方便。我还亲自将我的 Kindle 亮点存储为 JSON 文件 - 我使用 read.amazon.com 和一个 readwise 扩展来下载一本书的导出亮点。我将任何新书JSON文件放在外部目录的kindle文件夹中,每次重新计算倒排索引时,kindle文件都会提取任何新书亮点,将它们集成到存储在数据文件夹中的主kindle.json文件中,然后删除旧文件。虽然我首先为自己构建 Apollo,但我也希望其他人能够使用,如果他们认为它有价值。在本地使用 Apollo 确保您已安装 Go 和 youtube-dl,这是我们下载视频字幕的方式。你可以用这个来安装它。导航到项目的根目录: cd apollo 。注意因为 Apollo 从一些个人数据源同步,你需要删除它们,添加你自己的,或者在它们之上构建东西。否则,如果您尝试运行它,终端会抱怨,因此:

在首选编辑器中导航到 pkg/apollo/sources 并将 GetData 函数的主体替换为 return []schema.Data{} 创建一个 .env 文件并添加 PASSWORD=<val> 其中 <val> 是您想要的任何密码.这是添加或抓取数据所必需的,您需要“证明您是 Amir”,即对自己进行身份验证,然后您将来就不需要这样做了。如果这没有意义,请尝试在 apollo.amirbolous.com/add 上添加一些数据,看看会发生什么。返回外部目录(意味着您应该按照 GitHub 现在显示的方式查看文件)并在终端中运行 go run cmd/main.go。它应该工作!你可以从数据库中添加数据和索引数据如果你遇到问题,打开一个问题或者在 Twitter 上 DM 我 作为旁注,虽然我希望其他人能够使用 Apollo,但这不是“商业产品”所以请随意如果您愿意,可以打开一个功能请求,但除非它成为我个人想要使用的东西,否则我不太可能会得到它。倒排索引每 n 天重新生成一次(目前为 n = 3) 由于这不是商业产品,我不会在我的服务器上运行您的版本(如果您觉得它有用)。然而,虽然我设计了这个,首先也是最重要的,我希望其他人能够使用如果这是有用的东西,请参阅我如何使用这个

我可以选择使用 Go 的 gob 包作为数据库/倒排索引和 JSON。 gob 包肯定更快,但它仅在 Go 中是本机的,所以我决定使用 JSON 使数据在未来可用于潜在的任何非 Go 集成,并且如果我愿意,可以完全切换基础设施等。我使用用于我的词干分析器的 Go 滚雪球算法的移植版本。尽管我想构建自己的词干分析器,但实现一个强大的词干分析器(这是我想要的)并不是该项目的重点。由于词干分析器的算法不需要像其他类型的软件一样维护,我决定使用一个开箱即用的算法。如果我以后自己写,我会把它换掉。改进网络爬虫 - 像水银解析器一样更健壮,也许自己写