【问题标题】:Search for multiple words, across multiple models跨多个模型搜索多个单词
【发布时间】:2011-10-24 21:36:44
【问题描述】:

我正在尝试在网站中创建搜索功能,并且我希望用户能够搜索多个单词,根据各种模型中存在的条件执行子字符串匹配。

为了这个例子,假设我有以下模型:

  • 员工
  • 公司
  • 直辖市

一个县有多个市,有多个公司,有多个员工。

我希望搜索能够针对 Employee.firstname、Employee.lastname、Company.name、Municipality.name 和 County.name 的组合进行搜索,并且我希望最终结果是 Employee 实例。

例如,搜索字符串“joe tulsa”应该返回所有Employees,这两个词都可以在我在上一句中命名的属性中的某处找到。我会得到一些误报,但至少我应该让塔尔萨县的每个员工都被命名为“乔”。

我尝试了几种方法,但我不确定我是否走在正确的道路上。我正在寻找一种很好的 RoR 方式来执行此操作,并且我希望具有更多 RoR 智慧的人可以帮助制定一个适当的解决方案。


我尝试过的:

我对这种搜索不是很有经验,但是在 RoR 之外,我会手动创建一条 SQL 语句来将所有表连接在一起,为每个单独的搜索词创建 where 子句,覆盖不同的表。也许使用生成器。然后只需执行查询并循环遍历结果,手动实例化 Employee 对象并将它们添加到数组中。

为了在 RoR 中解决这个问题,我一直在:

1) 在我的项目中涉足与 Employee 模型相对应的命名范围,但是当我需要加入两个或更多“步骤”之外的表(市和县)时,我陷入了困境。

2) 创建了一个视图(称为“search_view”)将所有表连接在一起,以简化查询。然后我想我会在这张桌子上使用 Employee.find_by_sql() ,这会给我带来这些漂亮的 Employee 对象。我以为我会使用构建器来创建 SQL,而且似乎要使用 Arel,所以我尝试执行以下操作:

view = Arel::Table.new(:search_view)

但生成的 Ariel::Table 不包含任何列,因此无法用于构建我的查询。在这一点上,我有点卡住了,因为我不知道如何获得一个有效的查询生成器。

【问题讨论】:

  • 您是否尝试过自定义搜索引擎,如 Sphinx 或 Solr 以及适当的 gem?
  • 不,我没试过。我们说的是任何一张表中都有几千条记录,所以我认为这可能是矫枉过正。你认为这是要走的路吗?
  • 说实话我从来没有使用过任何一个(也许有人会发布优缺点答案或检查stackoverflow.com/questions/737275/…)但如果我必须解决类似的任务,我肯定会使用一个

标签: sql ruby-on-rails search solr sphinx


【解决方案1】:

我强烈建议您使用适当的搜索引擎来搜索此类内容,它会让您的生活更轻松。我遇到了类似的问题,我想“男孩,我敢打赌,设置像 Sphinx 这样的东西意味着我必须先阅读数千本手册和教程”。好吧,事实并非如此。

Thinking Sphinx 是我推荐的 Rails gem,它可以很容易地集成 Sphinx。您无需具备太多经验即可开始:

http://freelancing-god.github.com/ts/en/

我没有尝试过其他搜索引擎,但我对 Sphinx 非常满意。我设法在不到一天的时间内设置了一个相对复杂的实时搜索。

【讨论】:

  • 谢谢,我现在正在研究 Thinking Sphinx。我还发布了一个新问题,专门针对 Thinking Sphinx (stackoverflow.com/questions/7039142/…) 和我要解决的问题。我会在一段时间内将您的答案标记为已接受,除非出现更好的答案。 :)
猜你喜欢
  • 2021-11-24
  • 2011-01-03
  • 1970-01-01
  • 2020-12-14
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多