2009-01-02 102 views
8

我正在一個網站的'高級搜索'頁面上輸入一個關鍵字,比如'我喜歡蘋果',它可以使用以下選項搜索數據庫:Php/MySql'高級搜索'頁面

查找:與所有的話,隨着 精確短語,隨着 的話至少一個,如果沒有的話

我可以採取由「精確搜索」的護理:

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

通過「至少一家之言」:

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

但其「字詞的至少一個」和「無詞」說我卡上。

關於如何實現這兩個的任何建議?

編輯:關於「至少一個字」它不會是使用爆炸()打破關鍵字進言,並運行一個循環的好方法添加

(field='$keywords') OR ($field='$keywords) (OR).... 

因爲有在查詢中還有一些其他AND/OR子句,我不知道可以有多少個子句。

回答

12

我建議使用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

2

你可以使用

字詞的至少一個

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

如果沒有單詞

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

請參閱我上面的編輯。你認爲這是一個很好的解決方案,即可以在查詢中放入OR子句的數量是否有限制? – 2009-01-02 12:05:00

+0

可能有一個限制,但我從來沒有打過它,並且在語句的位置做了更長的時間,但添加得越多,查詢就會越慢,`like`特別慢。 – Re0sless 2009-01-02 12:07:29

2

我不知道,你可以很容易地在一個天真做的那些搜索選項像其他兩個一樣。

如果您需要支持這些場景,那麼在實施更好的搜索引擎時,這將是值得的。一個簡單的,可能會讓你通過這些線:

當一個項目被添加到數據庫中,它被分成單個單詞。在這一點上,「常用」單詞(the,a等等)被刪除(可能基於common_words表)。如果他們不存在,剩餘的單詞將被添加到單詞表中。然後在單詞條目和條目條目之間建立鏈接。

當搜索時,它是從單詞表中獲取單詞id並在連接表中正確查找條目id的情況。

1

搜索是出了名的難做好。

你應該考慮使用使用類似LuceneSphider第三方搜索引擎。

0

長頸鹿和Re0sless pooseted 2個很好的答案。

說明: 「SELECT *」很糟糕...只選擇您需要的列。 Re0sless在關鍵字之間放置了一個「或」字。 - 你應該消除常見的單詞(「」,「我」,「上午」,「和」..等) - mysql有一個8kb我相信查詢的大小限制,所以對於真正長的選擇,你應該slipt它分成不同的查詢。 - 嘗試消除重複的關鍵字(如果我搜索「你知道你喜歡它」的SELECT應該基本上只搜索「你」一次,並刪除常見詞爲「它」)

也嘗試使用「LIKE」和「MATCH LIKE」(請參閱​​mysql手冊頁),它可以做「模糊」搜索的奇蹟