我有一个名为产品的模型。我提供了一个全文搜索来搜索产品并使用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
答案 0 :(得分:1)
您获得的错误是因为您没有创建products
索引,here您可以看到引发错误的gem代码。
仔细查看此line,!self.index_exists? index: target_index
,它会检查索引是否存在,如果不是错误,则会显示。
所以这里有两个选项,强制导入如下:Product.import(force: true)
,请注意,如果索引存在则会破坏索引并再次创建索引。
另一种选择是首先创建索引然后执行导入:
Product.__elasticsearch__.create_index!
Product.import
我建议您阅读如何将模型映射到elasticsearch中的索引。 Link1,Link2。因为要查询,您需要了解索引的创建方式。