如何在MySQL中搜索“标签”?

时间:2010-10-07 16:37:54

标签: mysql

如果我的数据库中有一个名为product_tags的数据库,其中有两个字段:tag_idtag_name

这是架构:

CREATE TABLE `product_tags` (
 `tag_id` int(11) NOT NULL auto_increment,
 `tag_name` varchar(255) NOT NULL,
 PRIMARY KEY  (`tag_id`),
 UNIQUE KEY `tag_name` (`tag_name`)
) ENGINE=MyISAM AUTO_INCREMENT=84 DEFAULT CHARSET=utf8

在这里说一些标签:

  • 黄金
  • 黄钻
  • 白金
  • 玫瑰金
  • 金刚石
  • 蓝钻石
  • 粉红钻石
  • 黑钻石

我想搜索字符串“黄金钻石乐队

我只想提取以下标签:

  • 黄金
  • 金刚石

因为只有那些标签完全在字符串中。 黄色菱形都在字符串中但不在一起,因此应忽略yellow diamond标记。


- 另外,如果可能的话

如果我搜索“黄金蓝钻石带

我只想提取以下标签:

  • 黄金
  • 蓝钻石

diamond标记会被忽略,因为blue diamond标记就是匹配。


我该怎么做?

5 个答案:

答案 0 :(得分:5)

编辑:

select
   *
from 
   product_tags P
where
   INSTR('yellow gold diamond band', P.tag_name) > 0

答案 1 :(得分:1)

直观地说,您可以构建一个算法,该算法迭代搜索短语中由连续单词组成的所有可能的单词组合,然后找到哪些单词组合在您的标记表中。例如:

黄金蓝钻石带

您可能的连续组合将是:

  • 黄色
  • 蓝色
  • 金刚石
  • 黄金
  • 金蓝色
  • 蓝钻石
  • 钻石乐队
  • 黄金蓝色
  • 金蓝钻石
  • 蓝钻带
  • 黄金蓝钻石
  • 金蓝钻石带
  • 黄金蓝钻石带

从整个列表中,与您的原始列表匹配的唯一条款是:

  • 金刚石
  • 黄金
  • 蓝钻石

从这个列表中你可以剔除任何重复相同单词的项目,有利于更长的选项而不是更短的选项,假设更长的选项更具描述性。因此,在删除这些术语后,您有:

  • 黄金
  • 蓝钻石

这看起来像你想要的列表。现在,这种方法可行,但随着搜索短语中术语数量的增加,它会变得痛苦地缓慢。例如,只有您的5个术语生成了15个潜在的标签搜索。想象一下,如果你输入10个单词......

因此,我诚实的建议是你使用某种标点来分隔搜索中的标签,这样就可以通过简单地用标点符号分割搜索词组并搜索这些词来更容易找到标签,如下所示:

黄金,蓝钻,乐队

使用以逗号分隔的列表,您现在只有3个搜索字词而不是15个搜索字词,从而可以更轻松地搜索您的代码表。

答案 2 :(得分:1)

试试这个:

FROM product_tags 
WHERE `tag_name` REGEXP ? LIMIT 

答案 3 :(得分:0)

您可以执行以下操作:

WHERE @searchTerm LIKE CONCAT('%', tag_name, '%')

对于大量标签来说效率不高,但它可以在给定的简单情况下工作。

答案 4 :(得分:0)

我无法想到在SQL中直接执行此操作的任何好方法。

但是,如果我要在我的应用程序逻辑中实现它,这就是伪逻辑可能就像

1. Split the search string "yellow gold diamond band" using " " character. string[] search
2. Take the 1st value from the array i.e. yellow in this case.
3. Do a SELECT * FROM product_tags WHERE tag_name LIKE 'yellow%'
4. This will return "yellow gold" and "yellow diamond"
5. Loop through each of the results in 4
   a. Split each of these results using " " string [] result
   b. If the split array contains has count = 1, we found an exact match for "yellow". No need to search further
   c. If the length of the array > 1, Match the search[1] with result[1] till either you have exhausted the split array and find a match or dont find one
   d. If more than one match has been found, the longest match is considered
6. Go back to step 2 and repeat for the next string i.e search[1]