我在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
请告知我是否可以提供其他信息来帮助您。
答案 0 :(得分:0)
由于search_data
的{{1}}方法中有标签,因此您可以执行以下操作:
Person
确保您的Person.search("sometag", fields: [:tag])
方法使用以下方法返回正确的数据:
search_data
并确保您已重新编制索引。
Person.first.search_data