MySQL标签搜索

时间:2012-04-10 22:15:24

标签: php mysql search tags

我有一张包含图片和标签的表格(称为tbl_images

image_file    image_tags
----------    ----------------------------
test.png      tag1 another_tag tag2
hi.jpg        tag9 tag1 another_tag qwerty

我该怎么做才能:

  • 搜索'另一个'不返回任何内容
  • 搜索'tag1'会返回test.png行
  • 搜索'tag1 another_tag'返回test.png行
  • 搜索'qwerty tag2'不返回任何内容

用于搜索完整标记名称并同时搜索多个标记的能力,如果它们全部出现在同一行的同一image_tags字段中。 注意: -

  • 我只在一个字段内搜索
  • 使用PHP搜索输入(在$_GET['search_terms']中检索)
  • 完成
  • 我无法LIKE '%tag9%,因为tag9可能会出现在较大的标记中,例如Atag98,而且正如我所说,我只希望完全标记匹配。
  • 我不能LIKE ' tag9 '(注意前后空格),因为tag9可能出现在image_tags字段的开头(没有空格,所以没有匹配)
  • 我不能LIKE 'tag9 another_tag',因为我不知道另外一个标签是否在tag9之后,同样我也不能{i} LIKE 'tag9%another_tag'出于同样的原因; tag9也可以是更大标签的一部分(如前所述。)

此外,全文搜索是否适用于此?如果是这样,你能提供一个例子吗?

一个棘手的问题(无论如何;)任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:7)

使用图像存储标签的更好解决方案是创建一个单独的表,其中标签链接到图像。然后,您将为每个标记创建一行,例如

image_file (FK)  tag
---------------  -----------
test.png         tag1
test.png         another_tag
test.png         tag2
hi.jpg           tag9
hi.jpg           tag1
hi.jpg           another_tag
hi.jpg           qwerty

然后,您可以只查找与图像相关的标签:

SELECT tag FROM tags WHERE image_file = 'test.png'

或哪些图片与某个标签相关:

SELECT image_file FROM tags WHERE tag = 'tag1'

使用此方法可以避免您在问题中描述的LIKE的所有问题。在像这样规范化数据库时,不需要全文搜索。

答案 1 :(得分:2)

如果您的代码没有明确的分隔符,则需要进行正则表达式选择。

SELECT * FROM tbl_images WHERE image_tags REGEXP '[[:<:]]tag[[:>:]]'

[[:&lt ;:]]和[[:&gt;:]]标记识别MySQL中的单词边界...所以虽然REGEX选择可能比LIKE慢,但这仍然有用。

在此处阅读有关MySQL REGEX的更多信息:http://dev.mysql.com/doc/refman/5.1/en/regexp.html

答案 2 :(得分:0)

如果所有标记都被空格分隔,请将它们分解为数组,然后在数组中搜索您要查找的关键字。如果找到关键字,请抓住该行。

我不知道你在这里使用的语言是它应该如何:

loop all rows:
   get values of the current row:
   tags = array of the tags cell, explode ' '
   foreach (tag in tags):
      if (tag == keyword)
         save current row info
   end foreach;
end loop;

您不需要为每个标记创建一个新行,就像这里建议的那样,因为这不是一个理想的选择。