2017-06-23 45 views
2

的新功能。它表现得很干净。 当我第一次打电话给我的API时,它有时会用空数组响应,但再次调用相同的API,返回正确的响应。Elasticsearch-rails:响应有时是空的,第二个请求返回正确的响应

API输出 - 这是第一次

API输出 - 第二次 enter image description here

我的模型:

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秒内)。请参阅reference

如果需要实时搜索结果,您需要在索引上执行手动“刷新”。不过,我引用如下

尽管刷新比提交轻得多,但它仍然具有性能成本。在编写测试时手动刷新很有用,但是每次在生产中索引文档时都不要手动刷新;它会伤害你的表现。相反,您的应用程序需要了解Elasticsearch的近实时性,并为此留有余地。

测试环境,这是完全可以接受做一个“刷新”,所以您可以立即测试文档已经进行搜索。

因为好像你是在发展,我会反对这项建议,但你仍然可以自由地与一些做类似下面

def set_index 
    config = (Rails.env.development? || Rails.env.test?) ? { refresh: true } : {} 
    self.__elasticsearch__.index_document config 
end 
+0

但我在after_save的设定指标。这些记录是在几天前创建的。所以索引已经为他们设置了。每次关闭服务器并重新启动时,都会发生这种情况 – Disha

+0

我试过你的代码。没有运气 !还存在同样的问题:( – Disha

+0

嗯,我不太确定问题是什么。 –