Meilisearch v1.14 发布啦 ✨ 在我们的博客上阅读更多

返回首页Meilisearch 的标志
返回文章
2019 年 11 月 12 日

使用 Meili 搜索 Rust crate

Meili 实时搜索引擎演示,展示来自 crates.io 的软件包。

Search for Rust crates with Meili

今天,我将引导您深入了解 crates.io,以及我如何使用我们的实时搜索引擎 创建了一个替代搜索栏Meilisearch

Meili 实时、相关且容错的搜索引擎

Crates.io 是存储 Rust 社区 crate(软件包)的官方网站,也是 cargo 包管理器上传、更新和下载它们的地方。

Sean Griffin 是 crates.io 团队的成员,负责维护其当前的搜索引擎以及整个网站。 Kornel Lesinski 构建了 lib.rs,作为 crates.io 的替代品,并使用 Tantivy 为其搜索栏提供支持。说实话,我更喜欢它的颜色设计,这就是我将其用于我们的搜索演示的原因。

我决定运行我们的实时搜索引擎,并测试其随着时间推移相对于这些现有解决方案的相关性。我们的搜索引擎使用完全不同的算法;它基于前缀搜索并且具有容错性。

Meili 具有容错性,并支持许多其他功能

所以,我问自己:为什么不使用我们新的实时搜索引擎,使其对我们热爱的社区有用呢? 这将为我们提供大量反馈,并可能在此过程中获得一些 pull request。


在 Meili,我们管理一个内部 Kubernetes 集群,这对于为客户托管演示非常有用。 此演示的 Meilisearch 服务器当前在此集群中的一个 pod 上运行。

为了让 Meilisearch 展示这些 crate,我们需要找到 crates.io 上所有当前可用的软件包。 幸运的是,此索引在 GitHub 上以多个子文件夹的形式提供,其中包含软件包的名称和版本,包含大约 32 000 个文件。 每次 crate 更新到新版本或版本被撤回时,都会进行提交。

因此,我使用了 crates.io-index 仓库初始化我们新创建的 Meili 搜索引擎,但首先需要更多数据,例如,每个 crate 的描述、关键字和类别。 同样,Rust crates.io 团队在这里为我们提供帮助,我与 Pietro Albini 进行了交谈,他将我指向了不限速的服务器,这些服务器提供软件包内容。

现在我们可以检索有用的数据了,我创建了一个 异步爬虫,它可以下载、提取、检索 Cargo.toml,并将基本数据上传到 Meilisearch。

Meili 仪表板界面,显示原始文档

Meilisearch 现在理解了这些数据,并为我们提供即时、相关且容错的响应。 但是,新 crate 呢? 我们希望收到有关新 crate 的通知,并能够将它们发送到 Meilisearch。

Docs.rs 是官方网站,用于计算和存储 crates.io 托管的所有 Rust 软件包的文档。 它每分钟比较 crates.io 索引,以了解新的 crate 更新。 幸运的是,它提供了这些更新的 Atom feed。

这就是 Heroku 发挥作用的地方。 Heroku 在他们的服务器上每月提供大约 1000 个免费小时的计算能力,并为我们提供调度程序。 我们可以使用这些额度,并自由地 每 10 分钟通过获取 Atom feed 向 docs.rs 询问新更新的 crate,像以前一样下载更新的软件包,并最终实时更新我们的搜索引擎!

获取新的 crate 需要 4 秒

搜索结果令人满意,但不如预期,有些不对劲。 例如,当我们写“serde”时,第一个结果是相关的,但接下来的结果不是。 这与 Meilisearch 除了查询匹配词之外没有足够的数据来评估 crate 有关。

Meilisearch 不知道如何仅凭匹配词来确定相等的 crate

下载计数极大地改善了搜索结果。 此数据可通过 crates.io 获得。 每天都会完成完整的数据库导出,其中包含每个 crate 的下载次数。 我决定使用这些作为最后的排名标准,以帮助 Meilisearch 确定被认为相等的 crate。

感谢下载次数,Meilisearch 显示更好的结果

我部署了一个 Heroku 调度程序,每天运行以更新所有 crate 的下载量; 它大约需要 30 秒来下载 tarball、提取它、读取 CSV 并将 32 000 个 crate 的下载计数上传到 Meilisearch。 因此,我们远未达到每月 1000 个免费小时。


我认为这个搜索演示非常好,但我也考虑过添加同义词和停用词,因为 Meilisearch 支持这些。 例如,输入“db”并看到与“database”相关的结果会很令人愉快。 停用词将有助于忽略像“the”或“that”这样的无用词,这些词有时可能会污染搜索结果,但我们需要小心,因为 crate 名称可能由停用词组成。

Meilisearch 还支持基本过滤,未来如果能够按类别或特定关键字搜索 crate,那就太好了。

所有这些改进都可以由您完成; 该演示是开源的核心引擎源代码也已在 GitHub 上提供,这就是本文的重点! 看一看并讨论一下,更多人参与,更多功能!

Meilisearch indexes embeddings 7x faster with binary quantization

Meilisearch 通过二值量化将嵌入向量的索引速度提高 7 倍

通过使用向量存储 Arroy 实现二值量化,在保持搜索相关性和效率的同时,大大减少了大型嵌入向量的磁盘空间使用量和索引时间。

Tamo
Tamo2024 年 11 月 29 日
How to add AI-powered search to a React app

如何向 React 应用程序添加 AI 驱动的搜索

使用 Meilisearch 的 AI 驱动搜索构建一个 React 电影搜索和推荐应用程序。

Carolina Ferreira
Carolina Ferreira2024 年 9 月 24 日
Meilisearch is too slow

Meilisearch 太慢了

在这篇博文中,我们探讨了 Meilisearch 文档索引器所需的增强功能。 我们将讨论当前的索引引擎、其缺点以及优化性能的新技术。

Clément Renault
Clément Renault2024 年 8 月 20 日