MySQL标签搜索

q3d*_*q3d 0 php mysql tags search

我有一张桌子上有图片和标签(叫做tbl_images)

image_file    image_tags
----------    ----------------------------
test.png      tag1 another_tag tag2
hi.jpg        tag9 tag1 another_tag qwerty
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能:

  • 搜索'另一个'什么也不返回
  • 搜索'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之后,同样我也不能这样做LIKE 'tag9%another_tag'; tag9也可以是更大标签的一部分(如前所述).

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

一个棘手的问题(对我来说无论如何;)任何帮助将不胜感激.

Gee*_*ert 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
Run Code Online (Sandbox Code Playgroud)

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

SELECT tag FROM tags WHERE image_file = 'test.png'
Run Code Online (Sandbox Code Playgroud)

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

SELECT image_file FROM tags WHERE tag = 'tag1'
Run Code Online (Sandbox Code Playgroud)

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