
想象一下,你正在 Rails 中构建一个博客,你的用户在搜索栏中总是拼错帖子标题,结果却一无所获。这令人沮丧,对吗?
如果你的 Rails 应用程序或网站有一个搜索功能,既快又智能,足以处理错别字呢?
Meilisearch 就是你的答案。它是一个轻量级、容错、极速的搜索引擎,提供无缝的开发体验和开箱即用的相关性调优。
你可以通过以下方式使用 Ruby on Rails 在 Meilisearch 中构建搜索引擎:
- 设置 Meilisearch 并安装依赖项。
- 在 Rails 应用程序中配置 Meilisearch。
- 定义模型并启用 Meilisearch 索引。
- 填充和索引数据。
- 实现后端和前端。
- 自定义设置。
基于 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
启用排序,例如按创建日期排序。
在这里,选择正确的属性至关重要。例如,对于博客来说,索引title
和body
是合理的,但你可能希望根据你的用例添加tags
或author
。只选择最相关的字段进行索引,以获得更好的性能和更快的搜索结果。
模型准备就绪后,让我们向索引中添加一些数据。
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 的无缝集成使其成为寻求快速搜索引擎配置的开发人员的首选。