簡體   English   中英

在文本中搜索多個關鍵字

[英]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任何記錄,它們不會單獨查找abab是單個單片“單詞”並且該單詞在整個。

如果你想使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM