ruby-on-rails - 在RoR,ElasticSearch和Searchkick中在归属关系中搜索

标签 ruby-on-rails activerecord elasticsearch belongs-to searchkick

我有两个模型:

class Venue < ActiveRecord::Base
  has_many :loyalty_cards
end

class LoyaltyCard < ActiveRecord::Base
  belongs_to :venue
  searchkick word_start: [:venue_name, :venue_name_from_relation]

  def search_data
    attributes.merge(
      venue_name_from_relation: self.venue(&:name)
    )
  end
end

LoyaltyCard有两个字段:
venue_id: int #used for relation with venue if such venue exists
venue_name: string #or you can add venue name manually when creating loyalty card

我想搜索两个字段并按照GitHub上Searchkick isses(即https://github.com/ankane/searchkick/issues/112)的建议尝试以下调整:
searchkick word_start:[:地点名称,:地点名称来自_关系]
  def search_data
    attributes.merge(
      venue_name_from_relation: self.venue(&:name)
    )
  end

它成功搜索了 field 名称,但是没有在关联的 field 中搜索。

我还尝试了以下操作(以及其他一些改进):
  def search_data
    {
      venue_name_from_relation: venue.map(&:name)
    }
  end

但是,它无法通过nil类错误重新索引。

有任何想法吗?

谢谢,
罗曼

最佳答案

要正确获取 field 名称,因为它是belongs_to关联而不是has_many

def search_data
  attributes.merge(
    venue_name_from_relation: self.venue_name_from_relation
  )
end

def venue_name_from_relation
  self.venue.name
end

然后用这个来搜索
fields = ["venue_name", "venue_name_from_relation"]
LoyaltyCard.search(query, fields: fields, load: false)

或使用(在venue_name之上增强venue_name_from_relation)将一个字段提升到另一个字段
fields = ["venue_name^2", "venue_name_from_relation"]
LoyaltyCard.search(query, fields: fields, load: false)

搜索之前,请不要忘记reindexLoyaltyCard.reindex

关于ruby-on-rails - 在RoR,ElasticSearch和Searchkick中在归属关系中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34270805/

相关文章:

mysql - 未定义的方法 `add_foreign_key'

ruby-on-rails - 模型未保存时在客户端获取错误文本

ruby-on-rails - 无法使用事件记录查询删除重复记录

java - 使用 Java 代码中的不同引号执行 Bash 单行代码以进行 Elasticsearch 查询

python - 使用 Regexp 过滤器的 Elasticsearch Bool 查询

ruby-on-rails - ActiveRecord OR 查询

ruby-on-rails - Sinatra 中的 SASS : couldn't set custom directory

php - Codeigniter 的 `where` 和 `or_where`

php - Yii2:无法通过 + 1 更新列值

elasticsearch - 确定有多少文档被摄取到 ES 服务器中