如何改善java中的搜索功能?

时间:2015-10-21 06:55:44

标签: java android html database search

我做了一个简单的搜索功能,在大量的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 ;
}

问题:
问题是这种方法极其缓慢而根本没用 有没有办法或算法在短时间内搜索大量文件?

2 个答案:

答案 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的原因。