Rails 5:如何在弹性搜索中导入数据并执行条件搜索?

时间:2017-08-05 19:12:32

标签: ruby-on-rails ruby elasticsearch ruby-on-rails-5

我有一个名为产品的模型。我提供了一个全文搜索来搜索产品并使用AngularJS在客户端生成预先输入。搜索查询是正常的查询:

select * from products where name like = %abc% and company_id = 123;

然而随着我在表中的记录增长,使用上述方法的搜索时间增加了,所以我决定实现弹性搜索。我正在使用两个宝石gem 'elasticsearch-model'and gem 'elasticsearch-rails'。 如何索引产品型号。我尝试在 rails控制台中使用此Product._elasticsearch_.create_index!命令时出现以下错误:

2.4.0 :006 > Product._elasticsearch_.create_index!
ArgumentError: products does not exist to be imported into. Use create_index! or the :force option to create it.

以下是我的实施:

产品型号

require 'elasticsearch/model'
class Product < ApplicationRecord
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks
  belongs_to :company
  belongs_to :category
  belongs_to :gst
  belongs_to :user
  has_many :invoice_details
  self.per_page = 100

  Product.import
end

1 个答案:

答案 0 :(得分:1)

您获得的错误是因为您没有创建products索引,here您可以看到引发错误的gem代码。

仔细查看此line!self.index_exists? index: target_index,它会检查索引是否存在,如果不是错误,则会显示。

所以这里有两个选项,强制导入如下:Product.import(force: true),请注意,如果索引存在则会破坏索引并再次创建索引。

另一种选择是首先创建索引然后执行导入:

Product.__elasticsearch__.create_index!
Product.import

我建议您阅读如何将模型映射到elasticsearch中的索引。 Link1Link2。因为要查询,您需要了解索引的创建方式。