好吧,我正在尝试从lucene开始,我正在使用这个示例here,这是一个控制台示例。我通过eclipse运行它,但一切似乎都顺利进行,直到我进行第二次搜索。
该计划简要介绍以下内容:
IndexWriter
并使用Document
填充它。 IndexReader
:IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(indexLocation)));
IndexSearcher
:IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector
:TopScoreDocCollector collector = TopScoreDocCollector.create(5, true);
我提到这些是因为我不熟悉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
似乎在接下来的时间里也会获得正确的查询,所以我不认为问题会在这里。
答案 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);
并且它有效。
我不知道为什么。如果有人对此有解释,欢迎分享。