想要更好地控制您的搜索设置?了解我们的灵活的基础设施定价

回到主页Meilisearch 的标志
返回文章

Ruby on Rails 设计搜索引擎的完整教程

通过这篇可操作的分步教程,了解如何使用 Ruby on Rails 轻松构建搜索引擎。

2025 年 6 月 17 日阅读时长 6 分钟
Ilia Markov
Ilia Markov高级增长营销经理nochainmarkov
Full tutorial on how to design a search engine with Ruby on Rails

想象一下,你正在 Rails 中构建一个博客,你的用户在搜索栏中总是拼错帖子标题,结果却一无所获。这令人沮丧,对吗?

如果你的 Rails 应用程序或网站有一个搜索功能,既快又智能,足以处理错别字呢?

Meilisearch 就是你的答案。它是一个轻量级、容错、极速的搜索引擎,提供无缝的开发体验和开箱即用的相关性调优。

你可以通过以下方式使用 Ruby on Rails 在 Meilisearch 中构建搜索引擎:

  1. 设置 Meilisearch 并安装依赖项。
  2. 在 Rails 应用程序中配置 Meilisearch。
  3. 定义模型并启用 Meilisearch 索引。
  4. 填充和索引数据。
  5. 实现后端和前端。
  6. 自定义设置。

基于 Ruby on Rails 的搜索引擎可用于构建电子商务平台、博客或可搜索的知识库。无论你的用例是什么,使用 Meilisearch 在 Ruby on Rails 中构建的搜索引擎都将拥有一个强大且用户友好的流畅搜索界面。

1. 设置 Meilisearch 并安装依赖项

首先,我们需要启动 Meilisearch 并将其与我们的 Rails 应用程序集成。这将为你的搜索引擎奠定基础。

如果你选择本地托管 Meilisearch,它是开源且免费的。或者,你可以选择 Meilisearch Cloud 以获得完全托管的托管体验,无需自己处理基础设施或更新。

对于本教程,我们将使用本地实例,这非常适合测试。你需要 Ruby 3.0+ 和 Rails 6.1+ 以确保兼容性。旧版本可能仍然可以运行,但它们不受官方支持。

meilisearch-rails gem 简化了集成,处理索引和与数据库的同步。让我们安装 Meilisearch 并将 gem 添加到你的项目中。

要在本地安装 Meilisearch,请遵循官方GitHub 上的 Meilisearch 文档中的说明。你可以下载二进制文件并使用简单的命令运行它。运行后,可以通过http://127.0.0.1:3000访问 Meilisearch。

打开你的Gemfile ,然后在命令行中输入gem,添加

gem install meilisearch-rails

source 'https://rubygems.org.cn'

gem 'meilisearch-rails'

运行 bundle install 以安装 gem。如果遇到任何问题,请仔细检查你的 Ruby 和 Rails 版本,因为该 gem 需要最新版本才能完全兼容。

安装好 Meilisearch 和 gem 后,我们准备配置我们的 Rails 应用程序以连接到它。

2. 在 Rails 应用程序中配置 Meilisearch

现在,让我们配置我们的 Rails 应用程序以连接到 Meilisearch。把这一步想象成设置引导你的应用程序到搜索引擎的坐标。

创建一个新的配置文件来指定 MEILISEARCH_HOST MEILISEARCH_API_KEY。这确保了你的应用程序和 Meilisearch 之间的顺畅和安全的通信。

在开发环境中,你可以跳过 API 密钥,但在生产环境中,它对于最大安全性至关重要。正确的配置,例如我们现在正在做的,可以防止连接错误并确保平稳的索引和搜索。

config/initializers/meilisearch.rb创建新文件

Meilisearch::Rails.configuration = {
  meilisearch_url: ENV.fetch('MEILISEARCH_HOST', 'https://:7700'),
  meilisearch_api_key: ENV.fetch('MEILISEARCH_API_KEY', 'YourMeilisearchAPIKey')
}

如果你正在使用 Meilisearch Cloud,请将 URL 替换为你的云实例地址,该地址在你注册 Meilisearch Cloud 后即可获得。对于本地开发,默认 URL 正常工作。如果你遇到连接问题,请确保 Meilisearch 正在运行且 URL 正确。

现在我们的应用程序知道在哪里可以找到 Meilisearch,让我们设置一个模型来索引数据。

3. 定义模型并启用 Meilisearch 索引

这一步是奇迹开始的地方:我们将通过使用 Meilisearch 索引数据,使我们的数据可搜索。索引意味着对你的信息和数据进行编目,以便 Meilisearch 在用户搜索时能够快速找到匹配项。

在此示例中,我们将使用假设的 Rails 模型 Article 并包含 MeiliSearch::Rails 模块以启用自动索引。你将决定要索引哪些属性,例如 title body,并配置它们如何在搜索中使用。Meilisearch 通过 ActiveRecord 回调与你的数据库同步,因此你不必担心手动更新它。

首先,如果你还没有模型,则生成一个模型

rails generate model Article title:string body:text category:string
rails db:migrate

然后,打开app/models/article.rb并添加

class Article < ApplicationRecord
  include MeiliSearch::Rails

  meilisearch do
    attribute :title, :body, :category
    searchable_attributes [:title, :body]
    filterable_attributes [:category]
    sortable_attributes [:created_at]
  end
end

这是正在发生的事情:

  • attribute 列出需要索引的字段。
  • searchable_attributes 是用户可以搜索的字段。
  • filterable_attributes 允许过滤结果,例如按类别过滤。
  • sortable_attributes 启用排序,例如按创建日期排序。

在这里,选择正确的属性至关重要。例如,对于博客来说,索引titlebody是合理的,但你可能希望根据你的用例添加tagsauthor。只选择最相关的字段进行索引,以获得更好的性能和更快的搜索结果。

模型准备就绪后,让我们向索引中添加一些数据。

4. 填充并索引示例数据

为了测试我们的搜索引擎,我们需要可供搜索的数据。为此,我们将使用示例文章填充数据库。

使用 seed 文件,我们将创建 Meilisearch 将自动索引的示例记录。这将让你了解 Meilisearch 如何处理真实数据,并为你测试搜索查询做好准备。Meilisearch 的效率在这里真正闪耀,因为它能够以极快的速度索引数千条记录。

首先,创建或更新db/seeds.rb以包含你希望被搜索的文章

# Clear existing articles — use only in development or testing!
Article.destroy_all
articles = [
  { title: "Ruby on Rails Basics", body: "Learn the fundamentals of Rails.", category: "Beginner" },
  { title: "Advanced Rails Techniques", body: "Dive into complex Rails features.", category: "Advanced" },
  { title: "Rails Performance Tips", body: "Optimize your Rails app.", category: "Performance" },
  { title: "Building APIs with Rails", body: "Create robust APIs in Rails.", category: "API" },
  { title: "Rails Security Best Practices", body: "Secure your Rails application.", category: "Security" }
]
articles.each { |article| Article.create!(article) }
puts "Articles seeded!"

然后,运行

rails db:seed

Meilisearch 将使用前面提到的ActiveRecord 回调自动索引这些记录。要进行验证,你可以使用 Meilisearch 的 API 或仪表板来检查articles 索引。如果(正确)数据未出现,请确保你的 Meilisearch 实例正在运行且配置正确。

现在,事情变得更有趣了——是时候实现搜索功能了。

准备好尝试一下了吗?在免费试用中体验 Meilisearch 的强大搜索功能!

5. 实现后端搜索功能

首先,我们将创建一个控制器来处理搜索查询并显示准确的结果。

此步骤设置一个 SearchController 来处理用户输入并从 Meilisearch 获取结果。meilisearch-rails gem 通过提供一个 search 方法来简化此操作,该方法返回 ActiveRecord 对象,因此你可以像处理普通模型实例一样处理结果。此外,Meilisearch 的容错性确保即使拼写错误,用户也能获得相关结果。

创建app/controllers/search_controller.rb

class SearchController < ApplicationController
  def index
    @query = params[:q]
    @results = Article.search(@query) if @query.present?
  end
end

config/routes.rb 中更新你的路由

Rails.application.routes.draw do
  get 'search', to: 'search#index'
end

app/views/search/index.html.erb创建一个视图

<h1>Search Articles</h1>
<%= form_with url: search_path, method: :get, local: true do %>
  <%= text_field_tag :q, params[:q], placeholder: "Search articles..." %>
  <%= submit_tag "Search" %>
<% end %>

<% if @results %>
  <h2>Results for "<%= @query %>"</h2>
  <ul>
    <% @results.each do |result| %>
      <li><strong><%= result.title %></strong>: <%= result.body %></li>
    <% end %>
  </ul>
<% end %>

访问https://:3000/search并尝试查询,例如“Ralis”(“Rails”的错别字)。Meilisearch 的容错性仍将返回相关结果,正如预期。如果结果完全没有出现,或者看起来不正确,请检查你的模型的索引设置或 Meilisearch 日志。

现在,让我们通过我们的JavaScript API 客户端即时 Meilisearch 插件,将前端搜索界面提升一个档次。

6. 使用即时 Meilisearch 添加前端搜索

为了实现即时搜索体验,我们将使用 instant-meilisearch 集成 Meilisearch 的简单前端界面。

此步骤为你的应用程序启用动态、即时搜索功能,为用户提供在输入时进行交互的体验。Meilisearch 令人印象深刻的响应速度——响应时间 ≤50ms——确保结果几乎即时出现。我们将使用简单的 JavaScript 设置,但你可以使用React 等框架对其进行扩展,以获得精美的 UI。

通过 npm (或 yarn)安装库。注意:这假设你的 Rails 应用程序已设置 JavaScript 打包工具,例如 Webpacker 或 Importmaps。

npm install @meilisearch/instant-meilisearch

创建app/javascript/search.js

import { instantMeiliSearch } from '@meilisearch/instant-meilisearch';

const searchClient = instantMeiliSearch(
  '',// URL of Meilisearch instance
  '' // Meilisearch API key
);

const search = async (query) => {
  const response = await searchClient.search([{
    indexName: 'articles',
    query
  }]);
  const resultsDiv = document.getElementById('results');
  resultsDiv.innerHTML = response.hits.map(hit => `<div>${hit.title}: ${hit.body}</div>`).join('');
};

document.getElementById('search-input').addEventListener('input', (e) => {
  search(e.target.value);
});

更新app/views/search/index.html.erb

<h1>Search Articles</h1>
<input type="text" id="search-input" placeholder="Search articles...">
<div id="results"></div>

和之前一样,在https://:3000/search测试搜索。输入“Rail”应该会立即显示结果。

接下来,我们来探讨一下自定义选项。

7. 自定义 Meilisearch 设置

为了让你的搜索引擎更出色,你可以根据产品需求调整 Meilisearch 的设置。

Meilisearch 允许你自定义排名规则、同义词和停用词,以提高搜索相关性。例如,你可能希望将“Rails”和“Ruby on Rails”视为同义词,或者根据最近程度优先排序结果。

例如,这是调整排名规则以优先考虑某些字段的方法

Article.meilisearch_index.update_settings({
  rankingRules: [
    "words",
    "typo",
    "proximity",
    "attribute",
    "sort",
    "exactness",
    "created_at:desc"
  ]
})

这些设置确保了新文章排名更高。你可以随意尝试并测试不同的配置,看看哪种最适合你的用户。

最后,让我们确保您的搜索索引与数据库保持同步,以获得最准确的结果。

8. 处理更新和删除

meilisearch-rails gem 在你创建或更新记录时会自动处理索引。然而,了解如何自行管理更新和删除仍然值得,特别是如果你正在构建更复杂的 Web 应用程序。这将确保你的搜索结果始终反映最新数据,并避免过时或缺失的条目。

要手动从索引中删除记录

article = Article.find(1)
article.remove_from_index!
Article.destroy! # Removes from Meilisearch index

如果你需要重新索引所有记录,例如在更改任何索引属性之后,请运行

Article.reindex!

要完全清除索引,请使用

Article.clear_index!

但是,对大型数据集进行重新索引要谨慎,因为它可能会消耗大量资源。在生产环境中,你可以在流量低谷期安排此类任务。

我可以用 Ruby on Rails 免费构建搜索引擎吗?

是的,你可以免费使用 Ruby on Rails 和 Meilisearch 构建搜索引擎,用于开发和小型生产。

Meilisearch 的开源版本可以免费自托管在你的服务器或本地机器上,并且meilisearch-rails gem 没有许可费用。对于开发来说,这是理想的选择,因为你只需要一台服务器来运行 Meilisearch。

然而,对于生产环境来说,托管成本取决于你的基础设施。小型应用程序可以在经济实惠的服务器上运行,而大型项目的成本可能会飙升。

Meilisearch Cloud 提供 14 天免费试用,无需信用卡,非常适合测试。试用期结束后,定价将根据使用情况(文档和搜索请求)进行调整,小型企业从每月 30 美元的“构建”计划开始。

让我们将 Meilisearch 与其他开源搜索引擎进行比较。

Ruby on Rails 最好的开源搜索引擎有哪些?

开源搜索引擎提供强大、免许可的解决方案,可将搜索功能添加到 Rails 应用程序中。以下是最佳选择:

  • Meilisearch:以其速度(低于 50 毫秒)和简单性而闻名,Meilisearch 通过 meilisearch-rails gem 与 Rails 无缝集成。它非常适合中小型应用程序,提供容错和即时搜索功能。其轻量级特性使其易于自行设置和维护,同时还提供托管选项以实现免维护体验。
  • Elasticsearch:一个强大的引擎,Elasticsearch 擅长处理大型数据集和复杂查询。Searchkick 等 Gem 简化了集成。它非常适合企业应用程序,但比 Meilisearch 需要更多的资源和设置。
  • Solr:Solr 提供高级功能,例如全文搜索和分面。Sunspot gem 提供 Rails 集成。它高度可配置,但对于小型项目来说可能会变得复杂。
  • Typesense:Typesense 是一个轻量级的替代方案,用于为 Ruby on Rails 创建搜索引擎,提供快速、容错的搜索。虽然它缺少专门的 Rails gem,但其 API 易于用于简单的设置。

现在,让我们看看用于构建搜索引擎的其他语言。

除了 Ruby,还有哪些编程语言用于构建搜索引擎?

除了 Ruby,还有几种编程语言非常适合构建搜索引擎,每种语言都有其独特的优势。你可以用来构建搜索引擎的一些常用语言包括:

  • JavaScript:使用 Node.js,你可以使用 Lunr 等库或与 Meilisearch 集成来构建服务器端搜索。JavaScript 的异步特性非常适合实时搜索。了解如何在 JavaScript 中构建搜索引擎
  • PHP:像 Laravel 这样的框架使用 Scout 与 Meilisearch 集成,使 PHP 成为包含搜索引擎的 Web 应用程序的可靠选择。了解如何在 PHP 中构建搜索引擎
  • Golang:Golang 的性能和并发性使其非常适合高速搜索引擎。Bleve 等库支持全文搜索,进一步提高了其适用性。了解如何使用 Golang 构建搜索引擎

使用 Ruby on Rails 创建搜索引擎变得简单

使用 Ruby on Rails 和 Meilisearch 构建搜索引擎比你想象的要容易。设置 Meilisearch,索引数据,添加后端和前端,并根据你的喜好自定义设置。Meilisearch 的速度、容错性和与 Rails 的无缝集成使其成为寻求快速搜索引擎配置的开发人员的首选。

使用 Meilisearch,你可以创建一个快速且可扩展的搜索引擎

Meilisearch 50 毫秒以下的响应时间和用户友好的功能确保为你和你的用户提供出色的体验,无论你是构建博客、电子商务网站还是内部工具。此外,你可以免费开始并根据需要扩展。

What is search relevance: Everything you need to know

什么是搜索相关性:你需要了解的一切

了解什么是搜索相关性,它对用户体验和业务成果为何如此重要,以及如何通过实用策略和见解来改进它。

Ilia Markov
伊利亚·马尔科夫2025年8月12日
On-site search: Definition, implementation, best practices & more

站内搜索:定义、实现、最佳实践及更多

了解什么是站内搜索、它如何运作、其优势、如何实现、最佳实践等。

Ilia Markov
Ilia Markov2025年8月7日
Intranet search engines: What you need to know in 2025

内网搜索引擎:2025年你需要了解的一切

了解什么是内网搜索引擎、它们如何运作、为什么它们很重要,以及主要功能、优势、最佳实践等。

Ilia Markov
Ilia Markov2025年8月6日
© . This site is unofficial and not affiliated with Meilisearch.