改进搜索公式

时间:2012-05-07 21:37:37

标签: php mysql sql search

我想创建一个搜索脚本,我可以在其中搜索多个单词,但脚本会查找所有行中的单词而不是特定行。例如。

  __________________________   ________
 |Cheese                    | | Search |
  ——————————————————————————   ————————

然后我制作了一个说:

的PHP脚本
  

SELECT * FROM table WHERE column1 =“$ value”   OR column2 =“$ value”OR column3 =“$ value”...;

这将显示“Cheese”字样出现在任何列中的结果。问题是,我希望人们可以搜索“奶酪”和“厨房”,但我需要将这些词分开并搜索这样的内容:

  

SELECT * FROM table WHERE column1 =“$ value”   OR column2 =“$ value”OR column3 =“$ value”... AND column1 =“$ value2”   OR column2 =“$ value2”OR column3 =“$ value2”...;

问题是我真的不知道该怎么做。无论是单词分离还是如何在SQL数据库中找到单词。我也不知道如何搜索“Cheese”所属的单词..像“Cheesecake”..

如果有人知道如何做到这一点,请帮帮我..

谢谢。

5 个答案:

答案 0 :(得分:2)

您的所有SQL需求都是正确的括号:

SELECT *
FROM table
WHERE (column1 = "$value" OR column2 = "$value" OR column3 = "$value") AND
      (column1 = "$value2" OR column2 = "$value2" OR column3 = "$value2")

“AND”在“OR”之前得到评估。

顺便说一下,必须搜索多列表示数据模型可能存在缺陷。您可能需要一个表结构,将每个单词放在一个单独的行中。

答案 1 :(得分:2)

您需要查看MySQL的全文索引:http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

全文索引创建索引列中每个单词的索引(默认值要求单词至少为4个字符,但这可以在MySQL ini文件中更改)。然后你可以对多个单词进行搜索,包括单词的开头(cheese *将匹配cheesecake ......但请记住,没有办法使用索引来制作“蛋糕”匹配芝士蛋糕,因为索引是按字母顺序排列的)。这有以下优点:

  1. 比一系列AND()OR()语句快得多
  2. 能够返回相关性索引,所以你知道那一行 匹配所有关键字5次比具有的行更相关 其中一个词等等。

答案 2 :(得分:1)

无法在一个子句中搜索整行。但是,您可以使用LIKE子句搜索“Cheese”之类的单词,并将它们与“Cheesecake”匹配。

这比你想象的要复杂得多。我建议查看MySQL的MyISAM的全文搜索,或者如果您计划使用像Sphinx这样的频繁搜索或大量数据集。此外,如果您决定遵循当前路线,那么您正在寻找的是LIKE条款。

无论如何,要搜索包含奶酪或蛋糕的单词:

SELECT blah FROM tbl WHERE (col1 LIKE '%cheese%' OR col2 LIKE '%cheese%') AND (col1 LIKE 'cake' OR col2 LIKE 'cake');

但这非常效率低下。它不能使用索引,这意味着它需要对每个查询进行全表扫描。

答案 3 :(得分:1)

你对这些疑问的态度很好。

最显着的缺席是SQL中的通配符运算符。这用于匹配部分字符串。例如,这将找到“芝士蛋糕”和“奶酪饼干”记录:

SELECT *
FROM table
WHERE column1 = '%cheese%'

处理搜索的更高级方法涉及索引要搜索的数据。要么自己做,要么使用第三方或特定的数据库工具。在Google中查看。

但是,对于没有受到大量搜索影响的常规网站,您当前的方法很好。

还有一件事:如果你的问题是关于如何为搜索框中的每个单词自动添加额外的SQL行,你需要学习更多。首先在官方PHP文档(php.net)中查找这些术语,

  • 爆炸
  • 的foreach

答案 4 :(得分:-1)

为什么不检索你需要的所有数据并使用字符串函数来从大海捞针搜索项目,我相信stristr会对你有所帮助,或者你可以只使用SQL查询但是那可能会对你的数据库造成压力。如果我错了,请纠正我。