【问题标题】:How to search "tags" in MySQL?如何在 MySQL 中搜索“标签”?
【发布时间】:2010-10-07 16:37:53
【问题描述】:

如果我的数据库中有一个名为 product_tags 的表,其中包含 2 个字段: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

在这里说一些标签:

  • 黄金
  • 黄色钻石
  • 白金
  • 玫瑰金
  • 乐队
  • 钻石
  • 蓝色钻石
  • 粉红钻石
  • 黑色钻石

我想对字符串“黄色金钻戒”进行搜索

我只想拉以下标签:

  • 黄金
  • 乐队
  • 钻石

因为只有那些标签正好在字符串中。 yellowdiamond 都在字符串中,但不在一起,所以应该忽略 yellow diamond 标记。


-如果可能的话,额外补充

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

我只想拉以下标签:

  • 黄金
  • 乐队
  • 蓝色钻石

diamond 标记将被忽略,因为 blue diamond 标记将是匹配项。


我该怎么做?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    编辑:

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

    【讨论】:

    • 回答了第一个问题,但是使用第二个输入运行查询我也得到了“钻石”标签。
    • 带有“继承”之类的表怎么样?即一个有两列的表,两个外键都进入你的标签表,指定一个取代另一个。例如,“蓝色钻石”取代“钻石”。因此,如果您获得结果并看到“蓝色钻石”,则从结果中删除“钻石”。
    • 我也注意到了,仍然非常好。 Brian 对如何从列表中删除较短的重复单词(“钻石”)提出了建议。
    • 实际上,Brian 和@EboMike 的建议都很好,但如果搜索字符串是“带有钻石口音的蓝色钻石戒指”,我会想要两个标签。嗯,不太确定该怎么办……也许最好把它们留在里面。也许,只是给蓝色钻石比钻石更多的“权重/搜索相关性”,因为它是一个更窄的类别。
    • 使用 INSTR 提取所有标签,然后检查一个标签是否在另一个标签中,如果是,则删除它,最终得到最长的标签。
    【解决方案2】:

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

    黄金蓝钻戒圈

    您可能的连续组合是:

    • 黄色
    • 黄金
    • 蓝色
    • 钻石
    • 乐队
    • 黄金
    • 金蓝色
    • 蓝色钻石
    • 钻石带
    • 黄金蓝
    • 金蓝色钻石
    • 蓝色钻石带
    • 黄金蓝钻
    • 金蓝钻戒
    • 黄金蓝钻戒圈

    在整个列表中,与您的原始列表匹配的唯一字词是:

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

    您可以从此列表中剔除任何重复相同单词的项目,假设较长的选项更具描述性,则支持较长的选项而不是较短的选项。因此,删除这些条款后,您有:

    • 黄金
    • 蓝色钻石
    • 乐队

    这看起来像您想要的列表。现在,这种方法有效,但随着搜索短语中术语数量的增加,它会变得非常缓慢。例如,仅您的 5 个字词就产生了 15 个潜在的标签搜索。想象一下,如果你输入 10 个字......

    因此,我诚实的建议是,您可以在搜索中使用某种标点符号来分隔标签,从而通过简单地将搜索短语按标点符号拆分并搜索这些词来更容易找到标签,如下所示:

    黄金、蓝钻、戒指

    使用逗号分隔的列表,您现在只有 3 个搜索词而不是 15 个,从而更容易搜索您的标签表。

    【讨论】:

      【解决方案3】:

      试试这个:

      FROM product_tags 
      WHERE `tag_name` REGEXP ? LIMIT 
      

      【讨论】:

        【解决方案4】:

        你可能会做这样的事情:

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

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

        【讨论】:

          【解决方案5】:

          我想不出任何直接在 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]
          

          【讨论】:

            猜你喜欢
            • 2012-04-23
            • 2013-01-09
            • 1970-01-01
            • 1970-01-01
            • 2015-12-15
            • 1970-01-01
            • 2012-06-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多