在我的数据库中包含大约2百万行。这包含每行句子的集合(非英语)。
![Image of database][1]
作为示例,如果用户给出'abcd',则与第1,3行匹配。因此两者都应该选择。 因为数据检索需要花费大量时间。我正在使用以下代码来检索数据。如果任何给定的单词与数据库匹配,则应选择这些行。
sb.append("SELECT Sentence FROM corpus Where ");
for(int k=0;k<wordList.size();k++){
sb.append( " Sentence like '%" + wordList.get(k) + "%' OR ");
}
sb.append(" 1=0");
rs2 = dbc.sqlExecute(sb.toString());
该选择词可以在行中的任何位置。这可能是前面,中间或结尾。我的问题是当用户给出一些单词短语时,选择匹配的行需要花费大量时间。有没有适当的方法来加速我的数据库检索?我认为索引可能不起作用,因为我不是只搜索行的起点。匹配的单词可能包含行中的任何位置。有效的方法是什么?需要花费大量时间来检索。对我来说是一个巨大的问题。任何人都知道这样做的正确方法吗?
答案 0 :(得分:0)
你不需要循环,只需这样做:
sb.append("SELECT Sentence FROM corpus Where Sentence like '%");
sb.append(wordList);
sb.append("%'");
答案 1 :(得分:0)
我认为有效的解决方案是使用带有bind参数的PreparedStatement
并在循环中执行它。您可以使用For-Each
Loop,并为word
中的每个wordList
绑定参数,然后获取ResultSet
(使用try-with-resources
)并添加返回的{ {1}}使用类似
sentences
{1}}
List
虽然List<String> sentences = new ArrayList<>();
String sql = "SELECT Sentence FROM corpus WHERE Sentence LIKE ?";
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
for (String word : wordList) {
ps.setString(1, String.format("%%%s%%", word));
try (ResultSet rs = ps.executeQuery()) {
sentences.add(rs.getString(1));
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
列上的FULLTEXT索引可能是可取的,但此方法可以使用查询缓存并减小查询大小。 Sentence
条款只是让情况变得混乱,因为你想要任何匹配的行。您可能还会考虑OR
。