2014-01-07 150 views
0

我相信這是可能的,但我認爲這可能只是非常複雜的寫作。我想在各個領域搜索:MySQL按相關度搜索

='SearchTerm' 然後 Like %SearchTerm 然後 like SearchTerm% 終於 like %SearchTerm%。我想在我的表格中的每個字段上運行這個約30或40個字段。是否有一種簡單的方法可以在多個字段上運行,或者我必須聲明每一個字段?

我想我已經看過一個查詢,%查詢%查詢%等之間的不同匹配通過分配一個整數值然後排序。這是可能的這樣的查詢嗎?

任何意見和幫助正確的方向是非常感謝。

+0

不遵循這個問題,'查詢如%查詢和like查詢%'是什麼意思?查詢是否代表字段名稱? – Rottingham

+0

@Rottingham編號它代表搜索項 – Strawberry

+0

我已更改措辭以嘗試並提供幫助。 – Somk

回答

1

您應該在要搜索的字段上使用全文索引,並使用MATCH AGAINST而不是LIKE %%。它速度更快,並根據相關性返回結果。這裏更多的信息:

Mysql match...against vs. simple like "%term%"

+0

順便說一句..如果你使用innodb表,並且您尚未升級到5.6,則需要執行此操作,或將表更改爲MyISAM,以便提供全文索引。 –

0

你真的應該有某種ID在你的表中選擇行。

你就應該把一列與

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 

那麼你可以使用

SELECT * FROM table WHERE column1 LIKE "%SearchTerm%" AND id BETWEEN 1 AND 40 
+0

1和40之間有什麼區別? – Somk

+0

我已更新查詢,現在應該可以工作。只要你有一個ID列 – Ned

+0

,它會顯示你的搜索詞每列整個列。謝謝,但最後一節究竟做了什麼?即部分之間 – Somk

0

我做的非常相似,什麼東西你描述(在PHP和MySQL)

這是我的代碼:

$search = trim($_GET["search"]); 
$searches = explode(" ",$search); 
$sql = "SELECT *,wordmatch+descmatch+usagematch+bymatch as `match` FROM (SELECT id,word,LEFT(description,100)as description, 
     IFNULL((SELECT sum(vote) 
       FROM vote v 
       WHERE v.definition_id = d.id),0) as votecount, 
      "; 
$sqlword = ""; 
$sqldesc = ""; 
$sqlusage = ""; 
$sqlby = ""; 
foreach ($searches as $value) { 
    $value = mysqli_real_escape_string($con,$value); 
     $sqlword = $sqlword . "+ IFNULL(ROUND((LENGTH(word) - LENGTH(REPLACE(UPPER(word), UPPER('$value'), '')))/LENGTH('$value')),0)"; 
     $sqldesc = $sqldesc . "+ IFNULL(ROUND((LENGTH(description) - LENGTH(REPLACE(UPPER(description), UPPER('$value'), '')))/LENGTH('$value')),0)"; 
    $sqlusage = $sqlusage . "+ IFNULL(ROUND((LENGTH(`usage`) - LENGTH(REPLACE(UPPER(`usage`), UPPER('$value'), '')))/LENGTH('$value')),0)"; 
     $sqlby = $sqlby  . "+ IFNULL(ROUND((LENGTH(`by`) - LENGTH(REPLACE(UPPER(`by`), UPPER('$value'), '')))/LENGTH('$value')),0)"; 
}  
$sql = $sql . $sqlword ." as wordmatch," 
      . $sqldesc ." as descmatch," 
      . $sqlusage ." as usagematch," 
      . $sqlby ." as bymatch 
     FROM definition d 
     HAVING (wordmatch > 0 OR descmatch > 0 OR usagematch > 0 OR bymatch > 0) 
     ORDER BY 
     wordmatch DESC, 
     descmatch DESC, 
     usagematch DESC, 
     bymatch DESC, 
     votecount DESC)T1"; 
$queries[] = $sql; 
$result = mysqli_query($con,$sql); 

你可以在工作中看到http://unurbandictionary.comule.com/view_search.php?search=George+Miley+Cyrus這是當我搜索「George Miley Cyrus」時
它的作用是爆炸搜索字符串以查找每個單詞並返回每個單詞的出現次數,然後我做一個ORDER BY以使相關性(優先級)首先回來。所以在我的情況下word字段的相關性最高,然後description字段,然後usage字段,然後by字段。
在此版本的代碼之前,我使用的是LIKE,但它並沒有給我一個出現次數,因爲我希望我的搜索詞最常出現的行先於其他行返回。

+0

這似乎只是瘋了。查詢無法達到任何級別的運營效率。 –

+0

你還能從每個領域得到發生次數嗎?我想知道是否有另一種方法。 –

+0

你怎麼知道他想要計算出現的問題,這在問題中沒有說明。 –