【问题标题】:Full text search - tag system problem全文搜索-标签系统问题
【发布时间】:2011-04-26 14:38:57
【问题描述】:

我把标签存储在255 varchar区,像这种类型;

",keyword1,keyword2,keyword3,keyword 324,",keyword1234,

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

-

我可以找到类似这个sql查询的关键字3;

select * from table where keyword like = '%,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) against (",keyword3," in boolean mode)

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

http://prntscr.com/137u9

只查找 ,keyword3, ?

,关键字3,

谢谢

【问题讨论】:

  • 你试过从表中选择 X WHERE word IN tags 吗?

标签: php mysql full-text-search


【解决方案1】:

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

  • 您可以使用全文搜索来快速找到候选行,然后在后面使用 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

【讨论】:

  • 您好,我不能每行只存储一个关键字。
  • 这是一个通常用作连接表的对另一表中的主行信息的连接。它将多个标签与单个 ID 值相关联。这就是在 SQL 中存储每行项目列表的方式。
【解决方案2】:

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

我会将每个“标签”存储在一行中,然后按照安德烈亚斯的建议执行以下操作:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多