Lucene使用MultiThreads搜索

时间:2013-07-01 09:17:20

标签: java multithreading performance lucene

我需要在3GB大小的索引中执行我的机器学习项目> 3000查询。

为了加快性能,我创建了4个线程(我的macbook pro中有4个核心),我给每个人提供了总查询的一部分(如果我总共有N个查询,那么每个线程得到n / 4查询)。

我通过FSDirectory.open(file)打开索引,然后将IndexSearcher分享给所有主题。

问题是我没有看到任何性能改善也没有cpu增加。我玩了不同数量的线程,但仍然没有变化。

要将整个索引保存在RAM中是不可能的!

我在其他线程上看到解决方案是以只读方式打开索引,但我使用lucene 4.3,其中写入选项从读取器中删除,因此不再担心只读模式!

我知道this page和给出的提示,但看起来很安静。

所以我的问题是我如何并行索引搜索以提高lucene的真实性能?

以下是我正在使用的示例代码:

List<String> queryList = new ArrayList<String>();
List<Thread> threads = new ArrayList<Thread>();
for(int i=0;i<NUMBER_THREADS;i++){  
        List<String> querySubList = queryList.subList(fromIndex, toIndex);          
        QueryParser ngramIndexQueryParser = new QueryParser(Version.LUCENE_43, "ngram", new KeywordAnalyzer());
        startWorker(querySubList, threads, date, ngramIndexQueryParser, nGramSearcher);
}


public static void startWorker(List<String> querySubList,  List<Thread> threads,QueryParser ngramIndexQueryParser,IndexSearcher nGramSearcher){
    NGramIndexSearch task = new NGramIndexSearch(queryList, ngramIndexQueryParser, nGramSearcher);
    Thread worker = new Thread(task);
    worker.start();
    threads.add(worker);
}


public class NGramIndexSearch implements Runnable {
    public NGramIndexSearch(List<String> queryList, String year,QueryParser queryParser, IndexSearcher searcher){
//initialization
    }
    public void run() {
      for(String q:queryList){
            Query query = queryParser.parse(queryText);
            TopDocs topDocs = searcher.search(query, nrOfDocsToReturn);

      } 
    }

0 个答案:

没有答案