2010-10-17 86 views
0

我在255 varchar区域存储标签,就像这种类型;全文搜索 - 标签系统问题

“关键词1,关键词,KEYWORD3,键字324”,keyword1234,

(关键字必须开始和结束逗号(commakeyword123comma))

-

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

SELECT * FROM表,其中关键字像= '%,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的地方(在布尔模式 “KEYWORD3”)匹配(标签)对

SQL命令找到2239,2240,2241,但我不希望找到%KEYWORD3%或KEYWORD3

http://prntscr.com/137u9

想法只找到,KEYWORD3,?

,KEYWORD3,

谢谢

+0

你有没有试过从WHERE'word' IN标签中选择X? – Andreas 2010-10-17 15:15:48

回答

3

您不能单独使用全文搜索这一点 - 它仅搜索词。这里有几个不同的选择,你可以使用:

  • 您可以使用全文搜索快速找到候选行,然后后记使用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如果在所有可能。

+0

你好 我不能只存储每行一个关键字。 – ediz 2010-10-17 15:21:40

+2

这通常用作另一个表中主要信息行的连接表。它将多个标签与一个ID值相关联。这是如何在SQL中存储每行项目的列表。 – bobince 2010-10-17 15:33:51

0

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

我想每一个“标签”存储在一排然后做如安德烈亚斯建议,做这样的事情:

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

如果需要,出于某种原因,返回所有的标签在一排,你可以单独存储它们并将它们一起存储。所有全文

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

0

首先旨在用于文本搜索。所以你可以用它做什么是有限制的。要做你想做的事情,你需要检查Boolean Mode规范,看看"运营商是否可以帮助你,但即使这样,你的搜索可能不是100%准确。你需要为你的关键字设置一个字格式(最好不要在之类的文字分隔符)。