我正在网站的“高级搜索”页面上工作,您将在其中输入诸如“我喜欢苹果”之类的关键字,并且它可以使用以下选项搜索数据库:
查找:使用所有单词,使用确切的短语,使用至少一个单词,不使用单词
我可以通过以下方式来处理“精确短语”:
SELECT * FROM myTable WHERE field='$keyword';
“至少一个词”由:
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子句,但我不知道可以有的最大子句数。
我建议将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)"); } ?>
希望这有助于在布尔匹配中充分利用运算符