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