4

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

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

任何帮助或想法将不胜感激?

4

1 回答 1

1

出于性能原因,新索引的文档还不能立即搜索(大约 1 秒内)。见参考

如果您想要实时搜索结果,您需要对索引进行手动“刷新”。但是,我在下面引用

虽然刷新比提交要轻得多,但它仍然有性能成本。编写测试时手动刷新可能很有用,但不要在每次为生产中的文档编制索引时都进行手动刷新;它会损害你的表现。相反,您的应用程序需要了解 Elasticsearch 的近实时特性并考虑到这一点。

测试环境中,执行“刷新”是完全可以接受的,这样您就可以立即测试文档是否已经可搜索。

因为您似乎正在开发中,所以我建议您不要这样做,但是您仍然可以通过以下方式自由地这样做

def set_index
  config = (Rails.env.development? || Rails.env.test?) ? { refresh: true } : {}
  self.__elasticsearch__.index_document config
end
于 2017-06-23T09:22:26.157 回答