我选择与某些给定值匹配的行。在我的数据库中,内容大约有一百万行。这花费了大量时间来遍历每一行以选择与给定值相同的行。 I列搜索列包含句子集合。原始存储的句子集合。我认为索引可能不适用于我的执行。有没有正确的方法来解决这个问题?
sb.append("SELECT Cor_Sentence FROM corpus Where ");
for(int k=0;k<wordList.size();k++){
sb.append( " Cor_Sentence like '%" + wordList.get(k) + "%' OR ");
}
sb.append(" 1=0");
rs2 = dbc.sqlExecute(sb.toString());
以上代码正常工作。问题是读取每一行和匹配行所花费的时间。我可以使用什么样的技术?
答案 0 :(得分:0)
实现这一目标的最快方法是使用如下所示的REGEX:
WHERE Cor_Sentence REGEXP 'abc|def|geh|ijk'
答案 1 :(得分:0)
答案 2 :(得分:0)
使用MySQL的全文搜索功能。
为您要搜索的一列或多列添加FULLTEXT索引,然后在布尔模式下使用MATCH...AGAINST
来查找结果。
ALTER TABLE corpus ADD FULLTEXT INDEX (Cor_Sentence);
我无法为您提供您需要的Java,但您的查询应如下所示:
SELECT Cor_Sentence FROM corpus WHERE
MATCH (Cor_Sentence) AGAINST ('First Second Third' IN BOOLEAN MODE);
其中'First Second Third'
是要查找的以空格分隔的单词列表。此查询将选择列表中任何单词出现在搜索列中的行。有些运算符允许您指定某些单词是否必须出现,是否必须出现等等。
你可以在没有全文索引的情况下做到这一点但速度很慢。
注意:您必须使用MyISAM引擎才能使用全文搜索。
MySQL参考是here