2

我正在建立一个漫画网站并实施了搜索。搜索最初使用图像标题...这很好用:

if (strtolower($input)==strtolower(substr($row['title'],0,strlen($input)))) {

但现在我觉得很多人不会记得这个标题。所以我在数据库中添加了一个名为“keywords”的列,varchar [55]……我的测试条目是字符串“五、二、规则、食物、规则”。我想我可以替换$row['title']$row['keywords']并且搜索仍然有效。

如果我从字符串的开头开始搜索,例如输入“五,seco ...”,它会起作用,但如果我从字符串的中间开始搜索,例如“second”或“rule”等,则不会。

关于如何使这项工作发挥作用的任何想法?

谢谢!

4

4 回答 4

7

在漫画的专栏中这样做只会带来眼泪,因为它会破坏正常化。你应该做的是制作一个每个条目有一个单词的关键字表,然后是一个将关键字与漫画匹配的数据透视表。然后你可以做一个连接来找到所有匹配的漫画。

设置工作量更大,但从长远来看更灵活。

编辑:

关键字表:

id     keyword
1      x-men
2      action
3      mystery
4      batman
etc.

漫画关键字表

comic_id    keyword_id
45          3
678         1
678         2
77          3
77          4
etc.

第二个表(数据透视表)将漫画的 ID 与它们关联的关键字的 ID 匹配。这就是在大多数情况下应该建模的多对多关系。

于 2012-11-17T20:31:46.663 回答
4

直接的解决方案是stripos改用:

if(stripos($input, $row['title']) !== false) {
    // row matches
}

然而,这并不是一个很好的解决方案。将过滤卸载到您的数据库会更好,因此不匹配的行根本不必前往您的前端。如果您将关键字保留为逗号分隔的字段,那么LIKEorREGEXP将是一个不错的工具选择;如果您标准化您的数据库模式,以便使用单独的表对漫画与关键字的一对多关系进行建模,comic_keywords那么匹配将更加容易。

例如,假设comicidcomic_keywordscomic_idkeyword,您可以选择匹配的漫画

SELECT DISTINCT(comic_id) FROM comic_keywords WHERE keyword = 'blah'
于 2012-11-17T20:30:57.817 回答
1

您可以即时拆分列:

if (in_array(strtolower($input), explode(', ', $row['title']))) {
  /* found it */
}
于 2012-11-17T20:33:19.150 回答
0

看起来你需要Sphinx或(不太可能,但更容易设置)MySQLs full-text search

于 2012-11-17T20:31:18.750 回答