Php / MySql'高级搜索'页面

时间:2009-01-02 11:55:55

标签: php mysql sql search

我正在网站上的“高级搜索”页面上输入关键字,例如“我喜欢苹果”,并且可以使用以下选项搜索数据库:

  

查找:随着所有的话,随着   确切的短语,至少有一个   单词,没有单词

我可以通过以下方式处理'确切短语'。

SELECT * FROM myTable WHERE field='$keyword';

'至少有一个词'by:

SELECT * FROM myTable WHERE field LIKE '%$keyword%';//Let me know if this is the wrong approach

但它的'至少有一个词'和'没有词'我坚持。

有关如何实施这两项的任何建议吗?

编辑关于“至少一个字”,使用explode()将关键字分解为单词并运行循环添加

不是一个好方法
(field='$keywords') OR ($field='$keywords) (OR)....

因为查询中还有一些其他的AND / OR子句,而且我不知道可以有的最大子句数。

5 个答案:

答案 0 :(得分:13)

我建议使用MySQL FullText Search使用此Boolean Full-Text Searches功能,您应该能够获得所需的结果。

编辑:

根据您要求的条件请求示例(“它只是一个字段,他们可以选择4个选项中的任何一个(即1个单词,确切的单词,至少1个单词,没有该术语)。”)

我假设您正在使用基于您的初始帖子的PHP

<?php
$choice = $_POST['choice'];
$query = $_POST['query'];

if ($choice == "oneWord") {
    //Not 100% sure what you mean by one word but this is the simplest form
    //This assumes $query = a single word
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('{$query}' IN BOOLEAN MODE)");
} elseif ($choice == "exactWords") {
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('\"{$query}\"' IN BOOLEAN MODE)");
} elseif ($choice == "atLeastOneWord") {
    //The default with no operators if given multiple words will return rows that contains at least one of the words
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('{$query}' IN BOOLEAN MODE)");
} elseif ($choice == "withoutTheTerm") {
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('-{$query}' IN BOOLEAN MODE)");
}
?>

希望这有助于在布尔匹配中充分使用运算符,请参阅Boolean Full-Text Searches

答案 1 :(得分:2)

您可以使用

至少有一个单词

SELECT * FROM myTable WHERE field LIKE '%$keyword%' 
or field LIKE '%$keyword2%' 
or field LIKE '%$keyword3%';

没有单词

SELECT * FROM myTable WHERE field NOT LIKE '%$keyword%';

答案 2 :(得分:2)

我不确定你能否像其他两个那样以天真的方式轻松完成这些搜索选项。

如果您需要支持这些方案,那么实施更好的搜索引擎是值得的。一个简单的可能让你得到的东西是这样的:

将项目添加到数据库时,会将其拆分为单个单词。此时,“常用”字(a,a等)被删除(可能基于common_words表)。如果剩余的单词尚未存在,则将其添加到单词表中。然后在单词条目和项目条目之间建立了链接。

在搜索时,就是从单词表中获取单词ID以及在连接表中对项目ID进行适当查找的情况。

答案 3 :(得分:1)

众所周知,搜索很难做得很好。

您应该考虑使用LuceneSphider之类的第三方搜索引擎。

答案 4 :(得分:0)

Giraffe和Re0sless提出了2个好的答案。

注释: “SELECT *”很糟糕......只选择你需要的列。 Re0sless在关键字之间放置“OR”。   - 你应该删除常用词(“”,“我”,“我”,“和”......等)   - mysql对查询的大小有8kb i belive限制,所以对于很长的SELECTS,你应该把它放到单独的查询中。   - 尝试消除重复的关键字(如果我搜索“你知道你喜欢它”,SELECT应该基本上只搜索“你”一次,并将常用词理解为“它”)

还尝试使用“LIKE”和“MATCH LIKE”(参见mysql手册页)它可以为“模糊”搜索创造奇迹