如何使用 Sunspot 设置具有多对多关系的构面搜索?

Posted

技术标签:

【中文标题】如何使用 Sunspot 设置具有多对多关系的构面搜索?【英文标题】:How do I set up a facet search with a many to many relationship using Sunspot? 【发布时间】:2011-02-01 02:36:26 【问题描述】:

我之前没有实现过搜索功能,感觉有点卡住了。我有一个 Sunspot 搜索功能,可以根据关键字查找结果 - 这很好用 - 但我现在想实现多选方面功能,但我什至不知道如何设置基本方面搜索。

我有一个多对多的关系(在 Rails 中而不是在现实生活中):

Class People has_many :skills, :through => 经验(反之亦然等)

Class People < ActiveRecord::Base
  has_many :skills, :through => experience

  searchable do
    text :first_name, :surname
  end
end

在控制器中

@search = Sunspot.search(People)
   facet :skill_ids
end

这是我无法工作的基本示例。它会生成此错误:

Sunspot::UnrecognizedFieldError: No field configured for People with name 'skill_ids'

如何创建指向 :skill_ids 的链接

我想我一定是在模型中遗漏了一些参考 - 但我找不到任何例子可以参考关系的 Id。我发现的大多数示例在使用构面功能时都使用了该模型中已经存在的列。

如何才能使基本实现工作正常? 我将如何在视图中使用它 - 我是否必须调用 hits.facet 并迭代技能?显示此内容的代码是什么样的? 如何选择多个方面进行搜索? 我应该把它放在社区 wiki 中吗?

感谢您的宝贵时间!

【问题讨论】:

【参考方案1】:

您想要过滤、刻面或订购的任何内容,Sunspot 都需要知道。所以在你的模型中:

searchable do
  text :first_name, :surname
  integer :skill_ids, :multiple => true, :references => Skill
end

您在控制器中的#search 调用看起来正确。在您看来,您应该按照以下方式做一些事情:

- @search.facet(:skill_ids).rows.each do |row|
  = row.instance.name

row.instance 将返回该行值所引用的 Skill 实例(这就是 :references 选项在 searchable 定义中所做的事情)。

我不确定您所说的“选择多个方面进行搜索”是什么意思——可以通过调用facet 来生成多个方面(为用户提供选择以进一步优化搜索)在一次搜索中多次调用方法;然后您可以使用 with 方法在范围限制下使用他们的方面选择,您也可以根据需要多次调用。

说到 wiki,大部分信息都可以在 Sunspot wiki 中找到(有更多解释):

http://wiki.github.com/outoftime/sunspot/

【讨论】:

谢谢!我在 wiki 或其他任何地方都找不到对 :multiple 部分的引用 - 一定是使用了错误的搜索词或其他东西。你对我所说的“选择多个方面进行搜索”的意思是正确的——换句话说:通过多项选择进行过滤。 wiki 现在对我来说很有意义,有一个可以测试的工作演示!接下来我将尝试添加过滤功能:我认为我可以创建一个 link_to 并为其他方面传递参数是否正确,或者这是否还有很长的路要走?再次感谢!

以上是关于如何使用 Sunspot 设置具有多对多关系的构面搜索?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决具有多对多关系的石墨烯 django 节点字段

Fluent NHibernate:如何在关系表上映射具有附加属性的多对多关系?

如何保存具有直通关系的多对多字段

具有多对多关系的类型元素的 GraphQL 解析器

如何通过 Eloquent 中具有多对多关系的外部表中的列聚合进行分组?

laravel 使用具有多对多关系数据透视表的策略