2015-09-14 237 views
5

我需要在English dictionary(大約275,000個關鍵字)中搜索文本(大約500個字長)來檢測非英語單詞,現在我正在使用的查詢並未真正優化需要10秒以上來執行(有一個words表和texts表):搜索多個關鍵字的文本

SELECT word FROM words WHERE 'The quick brown fox jumps over the lazy dog' LIKE CONCAT('%', word, '%');

上心從here

我已經將word字段設置爲索引,並查看了將文本存儲在數據庫中或將其直接放入查詢中的人員的一些示例。

其他例子顯示人們使用FULLTEXT搜索,儘管有300k字我不認爲FULLTEXT將工作,我想用邏輯+brown +lazy -apple搜索是好的,但在我的情況下,我不需要太多的邏輯。

Another example我見過的是用IN (...)子句拼接單詞,儘管有500m的關鍵字查詢會非常長。

任何想法該怎麼辦?

眼下文本保存爲text場和InnoDB的話爲varchar(50)utf8_unicode_ci編碼,我聽說InnoDB的速度很慢,所以我可以使用MyISAM或任何其他。我使用MySQL 5.5,但如果有幫助,我可以更新到5.6。

+0

是否需要用mysql來完成? – baao

+0

這是一個PHP/MySQL網站 – Kenzier

回答

2

LIKE比較基本上只是通配符可用的相等性測試。它們不是一個通用的關鍵字搜索引擎。

WHERE foo LIKE '%a b%'會發現,包含文字文本a b在FOO場任何位置的任何記錄,他們不找ab分開,a b是一款單「字」,這個詞被搜索的全部。

如果你想搜索多個「單詞」使用LIKE,你所要做的

WHERE foo LIKE '%a%' OR foo LIKE '%b%' OR etc... 

從而迅速得到醜陋,效率極低 - %...搜索不能使用索引。

你會更好,切換到fulltext搜索系統,而不是,您可以在那裏當你開始進入了數百萬條記錄的簡單得多

WHERE MATCH(foo) AGAINST ('a b') 
+0

謝謝馬克,MATCH AGAINST的問題是我需要275k的OR語句,這將使一個非常長的查詢。你的意思是我應該做'匹配(文本)反對(單詞)'哪裏'詞是MySQL的領域? – Kenzier

+0

沒有。它匹配('field1,field2,...)'('你的文本')'。該文本可以是一個詞,或一個bajillion詞。 –

+0

哦,我看到了,參數混淆了。然而,查詢仍然非常長,如果存儲在文件中需要50MB,並且需要我先檢索所有關鍵字並將它們連接起來。這會是一個問題嗎? – Kenzier

0

的InnoDB會變得非常慢。這主要是由於訪問表時如何鎖定行。

我會使用MyIsam,因此您可以進行FULLTEXT搜索。也許像這樣:

select word from words where match(text) against(word) 

我不確定效率,但你真的不需要使用你所說的邏輯,我不認爲。

編輯:

我的代碼確實需要有一個以上的傳遞工作,作爲第二個參數真正需要的所有的話。我猜想你可以在SQL內部使用FOR循環來填充它,但我必須考慮代碼才能完成此操作。可能是一個遊標或存儲過程可以做到這一點。

但我同意其他答案,您需要使用FULLTEXT搜索。