如何在多个表列中搜索多个术语?

时间:2010-07-06 05:44:51

标签: php sql mysql search

我有一张表格列出了人员及其所有联系信息。我希望用户能够在桌面上执行智能搜索,只需键入一些内容并获取结果,其中输入的每个术语至少与表中的一列相匹配。首先,我做了一个像

这样的查询
SELECT * FROM contacts WHERE
    firstname LIKE '%Bob%'
 OR lastname LIKE '%Bob%'
 OR phone LIKE '%Bob%' OR
 ...

但是现在我意识到,对于像'Bob Jenkins'这样简单的事情,这将完全失败,因为它不够聪明,无法单独搜索第一个姓氏。我需要做的是分割搜索词并单独搜索它们,然后以某种方式与每个词的结果相交。至少这似乎是我的解决方案。但是最好的方法是什么呢?

我听说过全文和MATCH()... AGAINST()但这听起来像是一个相当模糊的搜索,我不知道设置的工作量是多少。我希望在合理的性能下准确无误或无结果。搜索需要在大约20列到120,000行上完成。希望用户不会输入超过两三个词。


哦对不起,我忘了提到我正在使用MySQL(和PHP)。

我刚想出全文搜索,这是一个很酷的选择(有没有办法调整它的严格程度?LIMIT只会斩断结果,无论它匹配得多好)。但这需要全文索引,我的网站正在使用视图,你不能索引视图吗?所以......

2 个答案:

答案 0 :(得分:0)

我建议使用MATCH / AGAINST。全文搜索是更高级的搜索,更像是谷歌,不那么基本。

它可以匹配多个表并将它们排列为它们具有的匹配数。

否则,如果这个词完全存在,尤其是在多个表中,您没有排名。您可以对服务器端进行排名,但这需要更多的编程/时间。

根据您使用的数据库,执行交叉列的功能或多或少会变得困难。你可能不想做20个JOIN,因为这将是一个非常慢的查询。

还有像Sphinx和Lucene这样的引擎专门用于进行这些类型的搜索。

答案 1 :(得分:0)

<强> BOOLEAN MODE

SELECT * FROM contacts WHERE  
MATCH(firstname,lastname,email,webpage,country,city,street...)  
AGAINST('+bob +jenkins' IN BOOLEAN MODE)

布尔模式非常强大。它甚至可以满足我的所有需求。我将不得不做一些测试。通过将+放在搜索字词之前,这些字词就成了必需。 (该行必须匹配'bob'和'jenkins'而不是'bob'或'jenkins'。这种模式甚至适用于非索引列,因此我可以在视图上使用它,虽然它会更慢(这是我需要测试的)。我遇到的最后一个问题是它不匹配部分搜索词,所以'bob'不会找到'bobby'例如。通常的%通配符不起作用,而是使用星号*