由 AI 驱动的混合搜索正在封闭测试中。 加入等候名单 以获得抢先体验!

前往主页Meilisearch 的标志
返回文章
2020 年 1 月 30 日

Meilisearch 查找 Rubygems

Clémentine Urquizar
Clémentine UrquizarMeilisearch 工程主管
Meilisearch finds Rubygems

作为 Rails 和 Ruby 的爱好者,我经常搜索能完美满足我用例的 gem。当我需要解决问题时,我希望选择合适的、最合适的解决方案。

Ruby gem 是在 Ruby 社区内创建的广泛的库。为任何任务寻找现成解决方案的最佳场所是网站 rubygems.org,这是一个 gem 的公共存储库,可以使用主页上的搜索框进行搜索。RubyGems 的网站是一个高效的工具,可方便包的共享和安装。但是,尽管其搜索栏非常有用,我还是决定创建一个更适合我们需求的替代搜索栏

即时搜索体验

首先,我想实现即时搜索体验。这意味着

  • 响应时间低于 50 毫秒
  • 在用户键入时,在搜索框下立即显示所有匹配结果,而无需他们按下 Enter 键

这在 RubyGems 的网站上尚未实现,因为每次发出请求时都会加载一个新页面。

相关性

您可以使用 RubyGems 的搜索栏获得相关且准确的结果,但大多数情况下只能通过执行高级搜索来实现,这并非总是很方便。您必须决定在不同部分填写什么。您是要通过输入其名称(例如“devise”)来搜索特定软件包,还是找到摘要与关键字(例如“deployment”)匹配的软件包?

但是,尽管有此功能,您可能找不到满足您需求的 gem。例如,如果输入“pagination”,您会希望在结果中看到 gem “kaminari”,它是 RoR 社区中最受欢迎的分页 gem。这是当提交关键字“pagination”时,我们从 RubyGem 的搜索栏获得的返回结果。如您所见,“kaminari” 在第 9 个结果之前都没有出现。

即使 优化搜索,显示的第一个结果也是 “kanimari-core”,它并不是我们想找到的更合适和更著名的 “kaminari” 包,但总比没有好。

然后,如果我们执行 在请求中包含拼写错误 的搜索,例如“pagintion”,则页面将显示没有任何结果,并建议您下一个搜索使用类似的词。

在作为用户体验过这些之后,我的目标是创建一个能够理解您的需求并立即找到它的单个搜索栏

Meilisearch 检查了所有这些要点,以及更多!

我从未实现过搜索引擎;我甚至从未用过搜索引擎,除了一个基本的 Elasticsearch 实例,没有任何配置用于概念验证。因此,我所需要的只是一个易于设置的工具,能够同时处理速度和相关性。这就是为什么 Meilisearch 非常适合这个项目。

Meilisearch是一个超相关且快速的搜索引擎。换句话说,它可以在 50 毫秒内返回您数据集中最相关的结果,因此它给人一种强烈的即时感。

此外,无需进行任何配置,它就可以处理搜索拼写错误:即,拼写错误。尝试提交“devose”而不是“devise”,Meilisearch 将返回“devise”作为第一个结果。

最后,Meilisearch 是开源的,并集成了简单的 RESTful API。您可以使用 cURL 或 Meilisearch 的包装器之一 与 API 无缝通信。

创建替代搜索栏

所有 gem 数据 在 RubyGems 的网站上都可以作为 PostgreSQL 转储文件获得,并且每天更新。因此,我编写了一个 Ruby 脚本来下载最新的数据集,解析 PostgreSQL 转储文件,并将所有数据推送到我的 Meilisearch 实例中。当然,它使用 meilisearch-ruby 包装器 与 API 通信。此脚本托管在 Heroku 中,并且每天借助 Heroku Scheduler 运行。

关于 Meilisearch 实例,在 Meili,我们管理一个内部 Kubernetes 集群,这是一个方便的工具,可以托管像这样的演示。对于想要了解更多信息的好奇读者,Meilisearch 非常 易于下载和自行运行(Homebrew、APT、Docker...)。

关于 HTML 和 CSS,我保留了 RubyGems 网站的原始结构。我的意图是开发与原始网站精神相同的“即时搜索体验”。前端使用 GitHub Pages 部署。

轻松提高相关性

无需进行任何设置,Meilisearch 即可返回相当相关的结果。当输入像“devise”或“faraday”这样的 gem 名称时,我们的搜索引擎可以快速找到最合适的软件包。不幸的是,就目前而言,关键字并不总是如此。

让我们回到我的“pagination”示例。如果我在不配置任何内容的情况下再次运行搜索,Meilisearch 将显示的第一个结果将是 Pagination gem。我根本没有在结果中看到 Kaminari。这是因为默认情况下,在标题中找到包含请求单词的文档优先于描述中包含请求单词的文档。由于数据集中有许多 gem 的标题中包含 “pagination”,因此解释了为什么 Kaminari 根本没有出现。

我还需要 Meilisearch 包含库的受欢迎程度。在我的数据集中,Ruby gem 的受欢迎程度由下载次数表示。我将我的 gem 分为八个知名度组(下载次数超过 5000 万次,超过 3000 万次,依此类推),从 07。后者被认为是知名度最高的组。

我将此信息作为名为 fame 的字段添加到每个文档(即 gem)。然后,我将此规则作为自定义排名规则集成到 Meilisearch 设置中。

看一下上面的代码片段。简而言之,Meilisearch 将逐个执行所有这些规则(_sum_of_typos_number_of_words ...),并按照此顺序对您的文档进行排序。当我添加我的自定义规则(即 rankingOrder 中的 famerankingRules 中的 fame: 'dsc')时,我实际上是在要求 Meilisearch 按知名度以降序排序。

您可能已经注意到,示例中我还有第二个自定义规则:total_downloads,以便我的结果按下载次数排序。但是,由于我选择将此规则放在列表的末尾,这意味着它被认为不如其他规则重要,因此它将是最后一个应用的规则。顺序至关重要。

我不会进一步详细介绍 Meilisearch 的默认排名规则,即使这是一个特别有趣的话题。描述我们的搜索引擎如何工作确实值得单独撰写一篇文章! 😉 剧透警告:Meilisearch 使用桶排序!

现在,如果您键入像“pagination”这样的 全局关键字,您将在第一位找到 Kaminari;如果您再次尝试输入一个不太著名的 gem 名称,例如 “pagy”,您仍然会得到您期望的 gem! 🎉

Meilisearch + 你 = 💛

这些小的设置非常容易集成,您的项目可能需要相同的行为。

如果您想为自己的 Meilisearch 体验做好准备,这里有一些有用的链接

如果您对我们的项目、它的工作方式或您有任何反馈感兴趣,请随时 联系团队! 😁

How to add AI-powered search to a React app

如何向 React 应用添加人工智能驱动的搜索功能

使用 Meilisearch 的人工智能驱动搜索构建一个 React 电影搜索和推荐应用。

Carolina Ferreira
Carolina Ferreira2024年9月24日
Build your Next.js Shopify storefront with Blazity

使用 Blazity 构建你的 Next.js Shopify 店面

学习使用 Next.js 和 Blazity 商业启动器构建 Shopify 店面。

Laurent Cazanove
Laurent Cazanove2024年8月19日
Meilisearch 1.8

Meilisearch 1.8

Meilisearch 1.8 带来了负关键词搜索、搜索稳健性和人工智能搜索的改进,包括新的嵌入器。

Carolina Ferreira
Carolina Ferreira2024年5月7日