2015-11-02 100 views
0

如何從MySQL表(Innodb)檢索記錄,並根據記錄的兩列可能包含多少個子字符串排序結果。根據匹配的數量搜索MySQL文本列並根據匹配的數量排序

我正在搜索包含在兩個不同列中的文本正文中的單詞。所以這個詞可能存在,它可能在前面或後面有未知的文本。

目前我的PHP代碼創建了一個查詢,該查詢使用不同數量的不同子字符串搜索兩列(包含文本)。

見簡單的例子:

$string = ""; 

foreach $array_of_words as $word) { 
    $string = $string . " column_one LIKE '% $word%' OR column_two LIKE '% $word%' OR "; 
} 

$string = substr ($string, 0, - 3); 

$query = "SELECT * FROM tbl_maintable WHERE (" . $string . ") LIMIT 5"; 

這工作得相當好,即使它不完全是我想什麼,但是與上面的代碼最大的問題是,它是資源密集型(7秒即可完成查詢對一個100k的數據庫)。

我已經看了一下自然語言搜索(在某種程度上),但是文檔並沒有給出我可以使用的明確的權威方法,以及MySQL服務器的MYSQL版本(5.5.44)問題沒有InnoDB的選項。不過,如果這是唯一的選擇,我會升級。

+0

你試過全文搜索查詢? – AnkiiG

+0

您是否嘗試過使用:'AND MATCH(columnName)AGAINST('textString'IN BOOLEAN MODE)> 0'替換'columnName'和'textString'.. – MaggsWeb

+0

我試過全文搜索,但該選項僅適用於InnoDB 5.6及以上。 –

回答

2

也許你可以使用MySQL's fulltext search並按相關性排序。

您需要更改您的表以添加全文搜索索引。

ALTER TABLE `tbl_maintable` ADD FULLTEXT INDEX `SEARCH`(`columnName`); 

然後運行這樣的查詢:

SELECT *, MATCH(columnName) AGAINST ('word1 word2 word3 word4' IN BOOLEAN MODE) AS relevance 
FROM tbl_maintable WHERE 
MATCH (columnName) AGAINST ('word1 word2 word3 word4' IN BOOLEAN MODE) 
ORDER BY relevance DESC 

還有其他的方法來實現這一點,但,沒有全文索引,會執行得非常糟糕,因爲關係數據庫並沒有真正建立此一種工作。

看看這個答案非全文選項,但會在性能成本:https://stackoverflow.com/a/20320723/933633

+0

這會很棒,但全文搜索僅適用於InnoDB 5.6及更高版本。看起來像我需要升級。 –

+0

@BarryBrian:看看我的編輯。我已經添加了一個來自另一個問題的答案,該問題計入了字段中的匹配詞。毫無疑問,它的性能會很差,但可能會幫助您,直到您升級MySQL並使用全文索引。 – TheCarver

+1

我最終升級MySQL並使用您的查詢,就像一個魅力。謝謝 –

相關問題