多次搜索lucene Index会返回零结果

时间:2014-06-11 08:36:15

标签: java lucene

好吧,我正在尝试从lucene开始,我正在使用这个示例here,这是一个控制台示例。我通过eclipse运行它,但一切似乎都顺利进行,直到我进行第二次搜索。

该计划简要介绍以下内容:

  1. 使用IndexWriter并使用Document填充它。
  2. 创建IndexReaderIndexReader reader = DirectoryReader.open(FSDirectory.open(new File(indexLocation)));
  3. 创建IndexSearcherIndexSearcher searcher = new IndexSearcher(reader);
  4. 创建TopScoreDocCollectorTopScoreDocCollector collector = TopScoreDocCollector.create(5, true);
  5. 我提到这些是因为我不熟悉lucene而且我正试图缩小这个问题。

    然后有一个循环,控制台读取查询(String)并执行以下命令:

    Query q = new QueryParser(Version.LUCENE_48, "contents", analyzer).parse(s);
    searcher.search(q, collector);
    ScoreDoc[] hits = collector.topDocs().scoreDocs;
    

    如前所述,在第一个循环中,一切都很顺利。之后没有返回结果(hits为空)。

    我的问题是我是否应该重置/清理搜索者或其他东西。 Query q似乎在接下来的时间里也会获得正确的查询,所以我不认为问题会在这里。

2 个答案:

答案 0 :(得分:2)

你是对的,以这种方式重用Collector导致了问题。解释只是Collector是有状态的,而不是为重用而设计的。

真的没有必要在这里使用Collector。它被认为是一个专家' API,这里完全没必要。这个例子的作者使用它有点令人费解。只需改变:

Query q = new QueryParser(Version.LUCENE_40, "contents", analyzer).parse(s);
searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;

要:

Query q = new QueryParser(Version.LUCENE_40, "contents", analyzer).parse(s);
TopDocs docs = searcher.search(q, 5);
ScoreDoc[] hits = docs.scoreDocs;

此外,IndexReader似乎在那里关闭。添加它可能是一个好主意。

答案 1 :(得分:1)

经过一些试验和错误研究后,我发现我必须为每个查询创建一个新的Collector才能工作。

我刚刚在循环中添加了collector = TopScoreDocCollector.create(5, true);并且它有效。

我不知道为什么。如果有人对此有解释,欢迎分享。