在文本中搜索多个关键字

时间:2015-09-14 19:04:09

标签: php mysql

我需要在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搜索是好的,但在我的情况下我不需要太多的逻辑。 / p>

Another example我已经看到用IN (...)子句连接单词虽然有500米的关键字但查询只会非常长。

任何想法该怎么办?

现在,文本被保存为text字段,而InnoDB中的varchar(50)字样为utf8_unicode_ci,我听说InnoDB很慢,所以我可以使用MyISAM或任何其他。我使用MySQL 5.5虽然如果有帮助我可以更新到5.6。

2 个答案:

答案 0 :(得分:2)

LIKE比较基本上只是支持通配符的相等测试。它们不是通用的关键字搜索引擎。

WHERE foo LIKE '%a b%'会在foo字段中找到任何包含文字文本a b的记录,他们不会分别查找ab,{ {1}}是一个单一的单词"并且完整地搜索该词。

如果你想搜索多个"单词"使用a b,你必须做

LIKE

很快变得丑陋,效率极低 - WHERE foo LIKE '%a%' OR foo LIKE '%b%' OR etc... 搜索无法使用索引。

您最好切换到fulltext搜索系统,在那里您可以更简单地使用

%...

答案 1 :(得分:0)

当你开始进入数百万条记录时,InnoDB会变得相当慢。这主要是由于它在访问表时锁定行的方式。

我会使用MyIsam,因此您可以进行FULLTEXT搜索。也许是这样的事情:

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

我不确定效率,但你真的不需要使用你所说的逻辑,我不认为。

编辑:

我的代码确实需要有多个传递才能工作,因为第二个参数确实需要是所有单词。我想你可以在SQL中使用FOR循环来填充它,但我必须考虑代码才能这样做。可能光标或存储过程可以解决问题。

我同意另一个答案,你需要使用FULLTEXT搜索。