Elasticsearch 学习笔记
引言
在现代的 Web 应用中,数据检索是一个重要的部分。用户需要能够快速准确地找到他们想要的信息,而开发者需要提供强大的搜索功能来满足这个需求。这就是 Elasticsearch 发挥作用的地方。
Elasticsearch 是一个基于 Lucene 库的开源搜索引擎。它提供了一个分布式、多租户的全文搜索引擎,具有 HTTP Web 接口和无模式 JSON 文档。Elasticsearch 被设计为可以扩展到上百台服务器,处理 PB 级别的结构化或非结构化数据。
Elasticsearch 基础
安装与配置
要在 Rails 项目中使用 Elasticsearch,我们需要首先安装 Elasticsearch 服务和 Ruby 客户端库。
-
安装 Elasticsearch 服务
-
我们可以从 Elasticsearch 官网下载并安装适合我们操作系统的版本。
-
使用 docker 或者 docker-compose 部署 Elasticsearch:
-
安装 Ruby 客户端库:
elasticsearch-rails
和elasticsearch-model
是两个常用的 gem,它们提供了与 Rails 集成的 DSL 和实用工具。我们可以通过在 Gemfile 中添加以下行来安装这两个 gem:
然后运行 bundle install
命令来安装这两个 gem。
接下来,我们需要在 Rails 项目中配置 Elasticsearch。在 config/initializers
目录下创建一个新的文件 elasticsearch.rb
,并添加以下代码:
这段代码将创建一个新的 Elasticsearch 客户端,并将其设置为所有模型的默认客户端。
创建和删除索引
在 Elasticsearch 中,索引是存储和检索数据的主要方式。我们可以把索引看作是一个优化了读、写操作的数据库。
要在 Rails 模型中创建索引,我们需要在模型类中包含 Elasticsearch::Model
模块,并调用 settings
和 mappings
方法来定义索引的设置和映射。例如,以下是一个简单的 User 模型:
在上述代码中,我们定义了 5 个字段。其中,articleContent
和 articleTitle
字段是文本类型,可以被全文搜索;而 id
、 isDelete
、status
字段是数字类型,适合于精确匹配。
要创建索引,我们可以在 Rails 控制台中运行 Article.__elasticsearch__.create_index!
命令。要删除索引,我们可以运行 Article.__elasticsearch__.delete_index!
命令。
索引和检索数据
在 Elasticsearch 中,数据是以文档的形式存储的。每个文档都有一个唯一的 ID 和一组字段。字段是文档的基本单位,它们存储了数据并定义了数据的结构。
要将 Rails 模型实例添加到 Elasticsearch 索引中,我们可以调用 __elasticsearch__.index_document
方法。例如:
要从 Elasticsearch 索引中检索数据,我们可以使用 search
方法。例如:
在上述代码中,search
方法返回一个包含搜索结果的 Elasticsearch::Model::Response::Response
对象。我们可以通过调用其 records
方法来获取原始的 Rails 模型实例。
高级搜索功能
除了基本的全文搜索外,Elasticsearch 还提供了许多高级搜索功能,如过滤、排序、聚合等。
过滤
过滤允许我们限制搜索结果只包含符合特定条件的文档。例如,以下代码将只返回名为 "John Doe" 的用户:
在上述代码中,我们使用了 term
过滤器来匹配 name
字段的精确值。注意,过滤器与查询不同,它不影响文档的相关性得分。
排序
排序允许我们按照一个或多个字段的值对搜索结果进行排序。例如,以下代码将返回所有文章,并按照 id
字段的值升序排列:
在上述代码中,我们使用了 match_all
查询来匹配所有文档,并使用 sort
参数来指定排序字段和顺序。
聚合
聚合允许我们对搜索结果进行分组和统计。例如,以下代码将返回所有文章,并计算每个 status
的文章数量:
在上述代码中,我们使用了 terms
聚合来统计每个 status
的文档数量。注意,由于我们是在整数类型的字段上进行聚合,所以直接使用 status
而不需要添加.keyword
后缀。
Elasticsearch 在 Ruby on Rails 中的应用
在 Ruby on Rails 中,Elasticsearch 可以用作全文搜索引擎,提供强大的搜索功能。我们可以使用 elasticsearch-rails
和 elasticsearch-model
gem 来简化与 Elasticsearch 的交互。
在 Rails 模型中使用 Elasticsearch
要在 Rails 模型中使用 Elasticsearch,我们需要在模型类中包含 Elasticsearch::Model
模块,并定义索引的设置和映射。例如:
在上述代码中,我们定义了 5 个字段:articleContent
、articleTitle
、id
、isDelete
和 status
。我们还覆盖了 as_indexed_json
方法来指定哪些模型属性应该被索引。
要将模型实例添加到 Elasticsearch 索引中,我们可以调用 __elasticsearch__.index_document
方法。当模型实例发生变化时,我们也需要更新索引。为此,我们可以使用 ActiveRecord 回调:
在上述代码中,我们使用了 after_commit
回调来在创建、更新或删除模型实例后更新 Elasticsearch 索引。
在 Rails 控制器中使用 Elasticsearch
要在 Rails 控制器中使用 Elasticsearch,我们可以使用 search
方法来执行搜索,并将结果传递给视图。例如:
在上述代码中,我们检查了 params[:query]
参数是否存在。如果存在,则执行搜索并返回结果;否则,返回所有文章。
我们也可以在视图中显示搜索结果。例如:
在上述代码中,我们迭代每个文章,并显示其标题和内容的摘要。
结论
Elasticsearch 是一个强大的全文搜索引擎,它提供了许多高级功能,如过滤、排序、聚合等。通过使用 Ruby 客户端库,我们可以轻松地将 Elasticsearch 集成到我们的 Rails 项目中。
评论区