我的模型具有嵌套的技能模型。它是一个常见的has_many例子。弹性搜索将技能索引为字符串数组。
我的问题是,我试图通过两种不同的输入来匹配这些技能。 所需的技能和奖励技能。
因此,如果我有两个查询术语,一个是必需的,一个是奖励,我想查询具有所需输入的技能属性,如果没有找到,则查询奖金输入。
我使用的是elasticsearch-rails gem。没想到我需要发布任何代码,因为这是更多的理论。 更新
class Profile
has_many :skills
...
end
class Skill
belongs_to :profile
end
映射
settings index: { number_of_shards: 1, number_of_replicas: 0 } do
...
mapping dynamic: 'false' do
indexes :skills, analyzer: 'keyword'
end
...
end
覆盖as_json
def as_indexed_json(options={})
hash = self.as_json(
include: {location: { methods: [:coordinates], only: [:coordinates] },
locations_of_interest: { methods: [:coordinates], only: [:coordinates]}
})
hash['skills'] = self.skills.map(&:name)
hash['interests'] = self.interests.map(&:name)
hash
end
我猜本质上我希望在多个字段上执行multi_match的反向并提升一个但是搜索一个具有多个输入的字段(必需和奖励)并且不依赖于所需的搜索结果和奖励输入。这会让事情变得更清楚吗?
这是我到目前为止的查询,第一次尝试。
if options[:required_skills].present? && options[:bonus_skills].present?
bool do
must do
term skills: options[:required_skills]
end
should do
term skills: options[:bonus_skills]
end
end
end
答案 0 :(得分:0)
class SkillContainer < ActiveRecord::Base
has_many :skill_links, dependent: :destroy, inverse_of: :skill_container
has_many :skills, through: :skill_links
has_many
end
##################################
create_table :skill_link do |t|
t.references :skill
t.references :skill_container
t.boolean :required
t.boolean :bonus
end
##################################
class SkillLink
belongs_to :skill_container
belongs_to :skill
scope :required, -> {
where(required: true)
}
scope :bonus, -> {
where(bonus: true)
}
end
class Skill < ActiveRecord::Base
has_many :skill_links, dependent: :destroy, inverse_of: :skill
has_many :skills, through: :skill_links
end
#required skills from any skill container
SkillContainer.last.skills.merge(SkillLink.required)
#bonus skills from any skill container
SkillContainer.last.skills.merge(SkillLink.bonus)
范围可与弹性搜索结合使用