簡體   English   中英

Php / MySql'高級搜索'頁面

[英]Php/ MySql 'Advanced Search' Page

我正在網站上的“高級搜索”頁面上輸入關鍵字,例如“我喜歡蘋果”,它可以使用以下選項搜索數據庫:

查找:使用所有單詞,使用確切的短語,至少有一個單詞,沒有單詞

我可以通過以下方式處理'確切短語':

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子句,我不知道可以有的最大子句數。

我建議使用MySQL FullText Search布爾全文搜索功能,你應該能夠得到你想要的結果。

編輯:

請求的示例基於您請求的條件(“它只是一個字段,他們可以選擇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)");
}
?>

希望這有助於在布爾匹配中充分使用運算符,請參閱布爾全文搜索

你可以用

至少有一個詞

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

沒有這個詞

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

我不確定你能否像其他兩個那樣以天真的方式輕松地做出那些搜索選項。

如果您需要支持這些方案,那么在實施更好的搜索引擎時是值得的。 一個可能讓你得到的簡單的東西是這樣的:

將項目添加到數據庫時,會將其拆分為單個單詞。 此時,“常用”字(a,a等)被刪除(可能基於common_words表)。 如果剩余的單詞尚未存在,則將其添加到單詞表中。 然后在單詞條目和項目條目之間建立鏈接。

搜索時,就是從單詞表中獲取單詞ID以及在連接表中對項目ID進行適當查找的情況。

眾所周知,搜索很難做得很好。

您應該考慮使用像LuceneSphider這樣的第三方搜索引擎。

長頸鹿和Re0sless提出了兩個很好的答案。

注意:“SELECT *”很糟糕......只選擇你需要的列。 Re0sless在關鍵字之間放置“OR”。 - 你應該刪除常用詞(“”,“我”,“上午”,“和”等等) - mysql對查詢的大小有8kb i belive限制,所以對於很長的SELECTS你應該把它放到單獨的查詢。 - 嘗試消除重復的關鍵字(如果我搜索“你知道你喜歡它”,SELECT應該基本上只搜索“你”一次並將常用詞理解為“它”)

還嘗試使用“LIKE”和“MATCH LIKE”(參見mysql手冊頁)它可以為“模糊”搜索創造奇跡

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM