Elasticsearch-rails:响应有时为空,第二次请求它返回正确的响应

时间:2017-06-23 07:36:42

标签: ruby-on-rails elasticsearch-rails

elasticsearch-rails新手。它表现得很糟糕。 当我第一次调用我的API时,它有时会响应空数组但是再次调用相同的API,返回正确的响应。

API输出 - 第一次 enter image description here

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第一次需要时间来回应吗?

任何帮助或想法都会非常感激吗?

1 个答案:

答案 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