【发布时间】: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