elasticsearch-rails
新手。它表现得很糟糕。
当我第一次调用我的API时,它有时会响应空数组但是再次调用相同的API,返回正确的响应。
我的模特:
class Consultation < ApplicationRecord
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
after_save :set_index
Consultation.import force: true
def set_index
self.__elasticsearch__.index_document
end
end
我的控制器:
def search
required_params_present = check_required_params(%i[search])
if required_params_present
searched_result = Elasticsearch::Model.search("*#{params[:search]}*", [Consultation]).records.records
data = ActiveModel::ArraySerializer.new(searched_result, each_serializer: ConsultationSerializer)
send_response(HTTP_STATUS_CODE_200, true, I18n.t('search'), data)
else
send_response(HTTP_STATUS_CODE_801, false, I18n.t('params_missing.error'))
end
rescue => e
send_response(HTTP_STATUS_CODE_500, false, e.message)
end
第一次响应为空。 难道Elasticsearch第一次需要时间来回应吗?
任何帮助或想法都会非常感激吗?
答案 0 :(得分:1)
由于性能原因,新索引的文档尚未立即搜索(在约1秒内)。见reference
你需要做一本手册&#34;刷新&#34;在索引上,如果你想要实时搜索结果。但是,我在下面引用
虽然刷新比提交轻得多,但它仍然具有性能成本。编写测试时手动刷新很有用,但每次在生产中索引文档时都不要手动刷新;这会伤害你的表现。相反,您的应用程序需要了解Elasticsearch的近实时性质并为其做好准备。
在测试环境中,完全可以接受&#34;刷新&#34;这样你就可以立即测试文件是否已经可以搜索。
因为您似乎正在开发,我会建议不要这样做,但您可以通过下面的内容自由地这样做
def set_index
config = (Rails.env.development? || Rails.env.test?) ? { refresh: true } : {}
self.__elasticsearch__.index_document config
end