【问题标题】:Exposing a new table and column to rails with elastic search & searchkick使用弹性搜索和 searchkick 向 Rails 公开新表和列
【发布时间】:2018-12-19 22:51:11
【问题描述】:

我已向 searchkick 添加了一个新字段,并且可以获取该模型的返回结果,但我正在尝试查找父模型作为结果。

People 可以有多个tags。我可以通过该架构上存在的任何属性来搜索People。我可以搜索 Tags 就好了,searchkick 和 elasticsearch 将返回结果。

我想按标签名称搜索,然后返回与该结果关联的人

search_query = if @q.present?
                 {
                   query: {
                     multi_match: {
                       query: @q.strip.downcase,
                       fields: %w(first_name last_name email_address phone_number address_1 name),
                       type: 'cross_fields',
                       operator: 'AND'
                     }
                   }
                 }
               else
                 {
                   query: {
                     query_string: {
                       query: ('*'),
                       default_operator: 'AND'
                     }
                   },
                   # order: { signup_at: :desc },
                   # page: search_params[:page],
                   # per_page: (Kaminari.config.default_per_page unless request.format == :csv)
                 }
               end

@results = Person.search search_query
@people = @results.records.where(active: true).order("people.#{sort_column}" + ' ' + sort_direction).page(search_params[:page])

这目前适用于仅搜索人员属性。如果我更换 @results = Tag.search search_query 输入标签名称时,我得到了结果标签。

有一个较旧的查询可以正常工作,但必须进行更改以允许全名搜索。旧查询是

 query: {
         query_string: {
                        query: (@q.strip.downcase),
                        default_operator: 'AND'
                       }
        },

这会返回关联的标签,其余代码保持不变。

这是存在于 person 模型上的 search_data 方法` # For Searchkick

def search_data
  attributes.
      each { |_k, v| v.downcase if v.is_a? String }.
      merge({
        tag: tags.map { |t| t.name.downcase },
        trait: traits.map { |t| t.name.downcase },
        trait_value: person_traits.map { |pt| pt.value.downcase },
        question: questions.map(&:id),
        answer: answers.map { |a| a.value.downcase },
        last_participated: last_participation_date.to_s,
        signup_at: signup_at.to_s
      })
end

如果我可以提供其他信息来提供帮助,请告诉我。

【问题讨论】:

    标签: ruby-on-rails elasticsearch searchkick


    【解决方案1】:

    由于您在Person 上的search_data 方法中有标签,您可以这样做:

    Person.search("sometag", fields: [:tag])
    

    确保您的 search_data 方法返回正确的数据:

    Person.first.search_data
    

    并确保您已重新编制索引。

    Person.reindex
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-10
      • 2015-10-07
      • 2019-10-04
      • 2021-05-24
      • 1970-01-01
      • 2018-05-24
      • 2013-09-16
      • 1970-01-01
      相关资源
      最近更新 更多