通过弹性搜索和搜索踢

时间:2018-07-11 19:48:06

标签: ruby-on-rails elasticsearch searchkick

我在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'
                       }
        },

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

这是人模型中存在的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

请告知我是否可以提供其他信息来帮助您。

1 个答案:

答案 0 :(得分:0)

由于search_data的{​​{1}}方法中有标签,因此您可以执行以下操作:

Person

确保您的Person.search("sometag", fields: [:tag]) 方法使用以下方法返回正确的数据:

search_data

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

Person.first.search_data