3

我正在编写一个高级搜索功能,它返回字符串与该表中许多文本列中的一个或多个匹配的记录。

就像是:

select * from some_table where (txt_1 like '%foo%') or (txt_2 like '%foo%') or...

或者:

select * from some_table where match (txt_1, txt_2, ...) against ('foo')

如果我可以进行全文搜索(还不确定)。

我的问题是,我怎么知道哪些列实际上匹配“foo”?

例如,如果我有这些记录:

id  txt_1  txt_2  txt_3  txt_4
1   'foo'  'bar'  'bar'  'foo'
2   'bar'  'bar'  'bar'  'bar'
3   'bar'  'foo'  'bar'  'bar'
4   'bar'  'bar'  'bar'  'bar'

我的查询应该返回如下内容:

id  txt_1_matches  txt_2_matches  txt_3_matches  txt_4_matches
1   1              0              0              1
3   0              1              0              0

我可以通过对简单查询结果进行后处理来做到这一点,但我想避免它。有没有一种干净、简单的方法来做到这一点?

干杯

4

2 回答 2

2

您可以使用全文索引有效地进行搜索,然后在选择列表中应用您的第一个解决方案(仅针对通过 WHERE 子句中的过滤器的行运行):

select (txt_1 like '%foo%') as `txt1_matches`, 
       (txt_2 like '%foo%') as `txt2_matches`, ...
from some_table where match (txt_1, txt_2, ...) against ('foo')

您可能还想研究功能更全面的全文搜索技术,例如Sphinx SearchApache Solr

例如,请参阅如何返回与 Solr 中的查询匹配的列的答案..?

于 2013-03-19T01:44:17.790 回答
2

你可以这样做:

SELECT * FROM
  (SELECT id,
          txt_1 LIKE '%foo%' AS a,
          txt_2 LIKE '%foo%' AS b,
          txt_3 LIKE '%foo%' AS c,
          txt_4 LIKE '%foo%' AS d
   FROM some_table) AS q
WHERE a OR b OR c OR d;

注意我把它放在一个子查询中。我需要在 MySQL 中执行此操作,否则它会抱怨“a”列不存在,等等...

于 2013-03-19T01:45:12.087 回答