我有一本近千万字的字典。我必须设计算法来快速搜索字符序列。
对于前。如果用户输入and
,则应用必须返回包含random
,sand
,stand
等序列的字词
...等等。
我现有的解决方案是在所有现有单词中搜索匹配的正则表达式,这是无效的。 我愿意重新构建现有数据库,缓存字典或在任何级别工作(如果需要)或者在Java中是否有一些现成的api?
答案 0 :(得分:3)
http://lucene.apache.org/core/
看看这个,这应该符合您的要求。
final File INDEX_DIR = new File("index");
try{
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "password");
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriter writer = new IndexWriter(INDEX_DIR, analyzer, true);
System.out.println("Indexing to directory '" + INDEX_DIR + "'...");
indexDocs(writer, conn);
writer.optimize();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
void indexDocs(IndexWriter writer, Connection conn) throws Exception {
String sql = "select id, name, color from pet";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
Document d = new Document();
d.add(new Field("id", rs.getString("id"), Field.Store.YES, Field.Index.NO));
d.add(new Field("name", rs.getString("name"), Field.Store.NO, Field.Index.TOKENIZED));
d.add(new Field("address", rs.getString("address"),Field.Store.NO, Field.Index.TOKENIZED));
writer.addDocument(d);
}
}
答案 1 :(得分:1)
我尝试使用trie(Where do I find a standard Trie based map implementation in Java?)。 根据您的要求,使用内存lucene索引也可能符合要求