全文搜索 - 标签系统问题

时间:2010-10-17 15:09:51

标签: php mysql full-text-search

我将标签存储在255 varchar区域,就像这种类型一样;

  

“,keyword1,keyword2,keyword3,关键字324,”,keyword1234,

(关键字必须以逗号开头和结尾(commakeyword123comma))

-

我可以找到像这样的SQL查询的关键字3;

  

从表中选择*,其中关键字如='%,keyword3,%'

CREATE TABLE IF NOT EXISTS `table1` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `tags` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `tags` (`tags`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2242 ;


INSERT INTO `table1` (`id`, `tags`) VALUES
(2222, ',keyword,'),
(2223, ',word is not big,'),
(2224, ',keyword3,'),
(2225, ',my keys,'),
(2226, ',hello,keyword3,thanks,'),
(2227, ',hello,thanks,keyword3,'),
(2228, ',keyword3,hello,thanks,'),
(2239, ',keyword3 but dont find,'),
(2240, ',dont find keyword3,'),
(2241, ',dont keyword3 find,');

(返回2224,2226,2227,2228)

-

我必须将此更改为完全文本搜索的命令。

  

select * from table1 where match(tags)where(“,keyword3,”in boolean mode)

sql命令找到2239,2240,2241,但我不想找到%keyword3%或 keyword3

http://prntscr.com/137u9

仅查找关键字3的想法?

  

,KEYWORD3,

谢谢

3 个答案:

答案 0 :(得分:3)

您不能单独使用全文搜索 - 它只搜索单词。您可以使用以下几种不同的替代方案:

  • 您可以使用全文搜索快速查找候选行,然后使用LIKE,因为您已经在使用LIKE来过滤掉全文搜索中的任何错误匹配。

  • 您可以使用FIND_IN_SET

  • 您可以规范化您的数据库 - 每行只存储一个关键字。

    INSERT INTO `table1` (`id`, `tag`) VALUES
    (2222, 'keyword'),
    (2223, 'word is not big'),
    (2224, 'keyword3'),
    (2225, 'my keys'),
    (2226, 'hello'),   -- // 2226 has three rows with one keyword in each.
    (2226, 'keyword3'),
    (2226, 'thanks'),
    (2227, 'hello'),
    -- etc...
    

如果可能的话,我建议normalizing your database

答案 1 :(得分:0)

是否有理由将所有标签存储在一行中?

我会将每个“标记”存储在一行,然后按照andreas的建议执行,并执行以下操作:

SELECT * FROM table1 WHERE tag IN('keyword0', 'keyword1', 'etc.')

如果由于某种原因需要返回一行中的所有标记,您可以单独存储它们并将它们GROUP_CONCAT放在一起。

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

答案 2 :(得分:0)

首先,FULL TEXT旨在用于文本搜索。所以你可以用它做什么是有限的。要执行您想要的操作,您需要查看Boolean Mode规范并查看"运营商是否可以为您提供帮助,但即使这样,您的搜索也可能不是100%准确。您需要为关键字强制使用单词格式(最好不要在其中加入单词分隔符,例如)。