2011-08-11 27 views
1

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

对于这个例子来说,假设我有以下型号:

  • 员工
  • 公司

一个县有多个直辖市,其中有多家公司,有多名员工。

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

例如,搜索字符串“joe tulsa”应该返回所有员工,其中的两个词可以在前面句子中指定的属性中找到。我会得到一些误报,但至少我应该让塔尔萨县的每个员工都成名为“乔”。

我已经尝试了几种方法,但我不确定我是否会走向正确的道路。我正在寻找一个很好的RoR-ish方式来做这件事,我希望有更多RoR智慧的人可以帮助勾画出合适的解决方案。


我曾尝试:

我不是很有经验的这种搜索的,但回报率之外,我会手动创建一个SQL语句中加入所有的表一起,创建where子句对于每个单独的搜索词,覆盖不同的表格。也许使用建设者。然后只需执行查询并遍历结果,手动实例化Employee对象并将它们添加到数组中。

为了RoR中解决这个问题,我已经:

1)在我的项目有什么对应于员工型号命名初涉范围,但是当我需要表格两个或两个以上的加盟我被困“步”(市和县)。

2)创建一个视图(称为“search_view”)将所有表连接在一起,以简化查询。然后以为我会在这个表上使用Employee.find_by_sql(),这会让我产生这些好的Employee对象。我想我会用生成器创建的SQL,它似乎阿雷尔是使用的东西,所以我试图做这样的事情:

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

但由此产生的阿里尔::表不包含任何列,所以无法构建我的查询。在这一点上,我有点卡住,因为我不知道如何得到一个工作查询生成器。

+2

你有没有尝试像Sphinx或Solr自定义搜索引擎适当的宝石? – Bohdan

+0

不,我没有试过这些。我们在任何表格中都有几千条记录,所以我认为这可能是过度的。你认为这是要走的路? – rogerkk

+0

说实话我从来没有使用任何它(也许有人会张贴答案的利弊或检查http://stackoverflow.com/questions/737275/pros-cons-of-full-text-search-engine -lucene-sphinx-postgresql-full-text-searc),但如果我必须解决类似的任务,我肯定会使用一个 – Bohdan

回答

3

我强烈建议使用适当的搜索引擎来实现这样的事情,它会让你的生活变得更轻松。我有一个类似的问题,我想“男孩,我敢打赌,设置一些像狮身人面像意味着我必须先阅读数以千计的手册和教程”。那么,情况并非如此。

思维狮身人面像是我推荐的Rails宝石,这使得它很容易整合狮身人面像。你并不需要有多少经验可言上手:

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

我还没有尝试过其他的搜索引擎,但我很满意狮身人面像。我设法在不到一天的时间内设置相对复杂的实时搜索。

+0

谢谢,我现在正在考虑思维狮身人面像。我还发布了一个新问题,专门针对思维狮身人面像(http://stackoverflow.com/questions/7039142/thinking-sphinx-and-searching-multiple-models)以及我试图解决的问题。我会在短时间内将您的答案标记为已接受,除非有更好的答案出现。 :) – rogerkk