2015-11-05 38 views
1

我有一張包含大約一百萬輛汽車記錄的表格。我想要實現搜索功能,使用戶可以對車輛的探索,可惜FULLTEXT列包含數據,如...MySql FULLTEXT在字詞之間搜索字符

「動車Fortuner-GJ00XX1234豐田」
「動車Fortuner-GJ00XX04567豐田」
等.....

這意味着特定的記錄是「動車」模型「fortuner」,註冊號爲「GJ00XX1234」和公司名「豐田」。

用戶試圖搜索「fortuner 1234」或「1234」,因爲通常用戶不記得完整的註冊號碼。因此,MySql返回所有記錄與「fortuner」,但它不能搜索「1234」。但搜索「GJ00XX1234」的作品。

我知道使用「LIKE'%1234%'」查詢可行,但存在性能問題,所以我必須僅使用FULLTEXT來實現此目的。

有人可以指導我如何實現它,而無需修改數據? 謝謝。

+2

我尊重投票,但一個應該提到他爲什麼投下來的問題。 –

回答

0

拆分空格的搜索字符串,並在查詢添加這樣

WHERE data LIKE '%fortuner%' OR data LIKE '%1234%' 

或簡單來說

WHERE data REGEXP 'fortuner|1234' 
在後一種情況下

,你的PHP代碼可以是:

$searchString = "fortuner 1234"; 
$search = str_replace(' ','|','fortuner 1234'); 

更新:

對於FULLTEXT:

WHERE   
MATCH (data) 
AGAINST ('+fortuner +1234' IN BOOLEAN MODE) 

這裏是manual

在執行此功能,MySQL使用有時被稱爲 所暗示的布爾邏輯,其中

  • 主張並

  • 代表不

[無操作]暗示或明示

+0

我知道使用「喜歡」可以實現,但我有數據非常龐大的數量,所以我只用'FULLTEXT人指數。 –

+0

創建一個包含來自FULLTEXT的可能關鍵字的列。從中搜索 – Thamilan

+0

通過創建新列和放置關鍵字(僅用於搜索目的)來創建冗餘不是好主意。 –

1

您不能使用全文搜索,而不分離/添加到索引實現這一目標。有一個boolean full-text search mode,允許追加一個小丑*,但由於索引在MySQL中工作的方式,所以它是not possible to prepend the joker

爲了保持全文搜索的性能優勢,最好的辦法可能是在全文索引中包含第二個包含數字的列或者僅爲搜索設置一個新列,其中包含類似motor car fortuner gj00xx1234 toyota 1234的內容。

如果你在前面加上%如。 LIKE %1234%REGEXP它會打你的表現,因爲索引不能被利用 - 導致全表掃描。取決於數據大小有多強烈。