我做了一个简单的搜索功能,在大量的html文件中找到字符串(+8000) 这是我的代码:
public Boolean loadAssetTextAsString(Context context, String search,String name) {
Boolean exist=false;
BufferedReader in = null;
try {
StringBuilder buf = new StringBuilder();
InputStream is = context.getAssets().open(name);
in = new BufferedReader(new InputStreamReader(is));
String str;
boolean isFirst = true;
while ( (str = in.readLine()) != null ) {
if (isFirst)
isFirst = false;
else
if (str.toLowerCase(Locale.getDefault()).contains(search)){
Log.e(" SUCC",str);
exist=true;
break;
} else { Log.e(" Fail",":(");
}
}
return exist;
} catch (IOException e) {
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
}
return exist ;
}
问题:
问题是这种方法极其缓慢而根本没用
有没有办法或算法在短时间内搜索大量文件?
答案 0 :(得分:0)
您所寻找的是“全文索引”。 您可以查看Lucene(或位于其上方的SOLR)。 我也听说有些数据库有类似的功能(例如oracle),但我不确定它有多成熟。
基本上,全文索引的想法是预备。将每个文档分解为单词(Lucene为其配置了一些可配置的分析器,这不是一项简单的任务),然后索引工具会创建一个索引,对于每个单词,它指出哪些页面包含它。粗略地说:
Given the documents:
doc #1: "I like cakes"
doc #2: "My cake recipe"
You'll have an index:
"cake" -> pages 1, 2
"like"-> page 1
"recipe" -> page 2
...
答案 1 :(得分:0)
我可以推荐很多东西;
首先,如果搜索的字符串太大而不是java,那么本机包含的函数可能会很慢,因为它不是它的设计目的。 Native contains函数将其操作委托给indexOf函数,对于大数据来说它并不是特别快。根据您的硬件/时间要求,您可以寻找更高效的字符串搜索库。这是我使用的图书馆,没关系http://johannburkard.de/software/stringsearch/。它的使用非常简单,性能非常好。但我相信有更好的选择。
此外,您可以使用redix trie或后缀树,它们更适合这种操作,而且速度更快,但它们需要对数据进行预处理,并且可能需要更多的处理能力。
您没有声明如果您使用线程或不使用线程,但根据我的理解,此搜索操作可以同时进行。即使您使用两个线程也可以将时间减少一半,提供读取操作不是瓶颈。
为了优化阅读操作,您可以做一些事情。你可以使用新的java.nio包,它提供了一些漂亮的技巧。 java.io包读取函数将文件完全读取到内存中,如果文件很大,可能会很快耗尽内存。但是使用java.nio包,您可以更有效地执行此操作。
此外,您可以在读取字符串进行搜索时进行读取操作,并缓存结果以使用它们。
你也可以将apache lucene集成到你的代码中,但是它的学习曲线有些陡峭,但这种搜索操作是构建apache lucene的原因。