2016-03-13 74 views
-3

我使用這種方式搜索地點。我如何在PHP和MYSQL中通過相關性進行搜索排序

$searchname = stringsafe($_GET['search']); 
$searchname2 = explode(" ", $searchname); 
$query = "SELECT * FROM places WHERE "; 

foreach ($searchname2 as $each) { 
    $i++; 

    if($i == 1){ 
     $query .= " title LIKE '%$each%' 
    OR description LIKE '%$each%' 
    OR SOUNDEX(title) = SOUNDEX('$each') 
    OR SOUNDEX(description) = SOUNDEX('$each')"; 
    }else{ 
     $query .= " OR title LIKE '%$each%' 
    OR description LIKE '%$each%' 
    OR SOUNDEX(title) = SOUNDEX('$each') 
    OR SOUNDEX(description) = SOUNDEX('$each')"; 
    } 
} 

$select_place = $mysqli->query("$query limit 20"); 
$num_place = $select_place->num_rows; 

if($num_place == 0){ 
    echo "<div class='message-no'>No results</div>"; 
} 
else{ 

while ($rows_place = $select_place->fetch_array(MYSQL_ASSOC)){ 

$id_place   = $rows_place ['id']; 
$title_place   = $rows_place ['title']; 
$description_place = $rows_place ['description']; 

echo $title_place."<br>"; 

} 

它運作良好,但結果沒有以正確的方式排序。這是我試過的:

$select_place = $mysqli->query("$query ORDER BY relevance DESC limit 20"); 

我沒有達到預期的結果,它應該按相關性排序。

+1

什麼是錯誤? –

+0

首先'MYSQL_ASSOC'應該是'MYSQLI_ASSOC' –

+0

你怎麼在這裏定義「相關性」? –

回答

1

SOUNDEX不按相關性搜索的正確方法:探測法是拼音算法:「犬」同音代碼,即相同的「doc」,「人」 =「多」等。

也許你可以找一些有用的東西看看Natural Language Full-Text Searches

使用MATCH/AGAINST您可以實現您的目標。

另請參見this post,其中包含一步一步的示例。

要使用全文搜索,你必須一個FULLTEXT索引添加到您要在其中進行搜索字段:

ALTER TABLE usertable ADD FULLTEXT(description); 
(...) 

然後,您可以使用查詢像這樣的(無爆炸字符串搜索):

SELECT (...), MATCH (description) AGAINST ('$searchname') AS relevance 
    FROM places 
    WHERE MATCH (description) AGAINST ('$searchname') 
    ORDER BY relevance DESC 

閱讀仔細提供的鏈接,因爲有很多選項可以配置以獲得更好的結果。

+0

由於OP沒有定義含義這個問題的答案是純粹的猜測。這可能是對還是錯。 – Shadow

+0

...是的......我同意所有都是相對的。但問題標記爲'mysql',OP說'按相關性搜索順序'和[官方mySQL](http://dev.mysql.com/doc/refman/5.7/en/fulltext-natural-language.html)說「對於表中的每一行,MATCH()都會返回一個相關值「,所以...還有一個問題,比如」如何打印一個變量?「可能是有爭議的:OP必須指定他想要的是變量值而不是變量名?無論如何,謝謝你的觀點。我同意我可能誤解了這個問題:這不會是第一次......而且會再次發生。 :) – fusion3k

0

我會咬這個問題。我們尊敬的Stack Overflow同事已經在一個相關的切線上消失了。 :-)。

您必須計算相關性,然後才能按順序排序。你的問題沒有告訴我們你是如何知道哪些結果是相關的。一般來說,計算相關性是計算機科學中的一個難題。您必須從算法上猜測用戶的含義。例如,如果她搜索「約克」,是紐約,紐約,還是「約克,賓夕法尼亞」,或「約克公爵」(英格蘭的一位世襲貴族)最相關?

也許你的意思是「緊密匹配」而不是「相關性」。你可以嘗試這樣的事:

SELECT title, description, SUM(relevance) relevance FROM 
    ( 
    SELECT id, title, description, 10 relevance FROM places WHERE title LIKE '%$val%' 
     UNION ALL 
    SELECT id, title, description, 8 FROM places WHERE description LIKE '%$val%' 
     UNION ALL 
    SELECT id, title, description 4 FROM places WHERE SOUNDEX(title) = SOUNDEX('$val') 
     UNION ALL 
    SELECT id, title, description, 4 FROM places WHERE SOUNDEX(description) = SOUNDEX('$val') 
) results 
    GROUP BY title, description 
    ORDER BY SUM(RELEVANCE) DESC 

10, 7, 4分配差異的相關性的權重不同類型的比賽。

請注意。SOUNDEX algorithm是20世紀初由美國電話壟斷公司設計的,用於查找美國人姓名的目錄幫助變體拼寫。這是一個簡單的算法。它幾乎不適用於英文姓氏,對於非英語單詞根本不起作用。

相關問題