[英]Search a text for multiple keywords
我需要搜索一個文本(大約500字長)來搜索英語詞典中的單詞 (大約275,000個關鍵詞)來檢測非英語單詞,現在我正在使用的查詢沒有真正優化,執行時間超過10秒(有一個words
表和一個texts
表):
SELECT word FROM words WHERE 'The quick brown fox jumps over the lazy dog' LIKE CONCAT( '%', word, '%' );
從這里得到了主意。
我已經將word
字段設置為索引,並看到了一些將文本存儲在數據庫中或直接將其放入查詢中的示例。
其他例子顯示人們使用FULLTEXT搜索雖然有300k字我不認為FULLTEXT會起作用,我想用邏輯+brown +lazy -apple
搜索是好的,但在我的情況下我不需要太多邏輯。
我見過的另一個例子是用IN (...)
子句連接單詞雖然有500m關鍵字,但查詢只會非常長。
有什么想法怎么辦?
現在,文本被保存為text
字段,並且InnoDB中的單詞為varchar(50)
,並且utf8_unicode_ci
編碼,我聽說InnoDB很慢,所以我可以使用MyISAM或其他任何東西。 我正在使用MySQL 5.5雖然如果有幫助我可以更新到5.6。
LIKE
比較基本上只是支持通配符的相等測試。 它們不是通用的關鍵字搜索引擎。
WHERE foo LIKE '%ab%'
會在foo字段中的任何地方找到包含文字文本ab
任何記錄,它們不會單獨查找a
或b
, ab
是單個單片“單詞”並且該單詞在整個。
如果你想使用LIKE
搜索多個“單詞”,你必須這樣做
WHERE foo LIKE '%a%' OR foo LIKE '%b%' OR etc...
這很快變得丑陋,效率極低 - %...
搜索不能使用索引。
你最好切換到全文搜索系統,在那里你可以更簡單
WHERE MATCH(foo) AGAINST ('a b')
當你開始涉及數百萬條記錄時,InnoDB會變得相當慢。 這很大程度上是由於它在訪問表時鎖定行的方式。
我會使用MyIsam,這樣你就可以進行FULLTEXT搜索。 也許是這樣的:
select word from words where match(text) against(word)
我不確定效率,但你真的不需要使用你所談論的邏輯,我不這么認為。
編輯:
我的代碼確實需要有多個傳遞才能工作,因為第二個參數確實需要是所有單詞。 我想你可以在SQL中使用FOR循環來填充它,但我必須考慮代碼才能這樣做。 可能是游標或存儲過程可以解決問題。
我同意另一個答案,你需要使用FULLTEXT搜索。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.