2012-02-06 39 views
1

玩弄Lucene。试图让我的更改对其他阅读主题可见。没有重建索引。为此,我使用SearcherManager类。Java Lucene NRT搜索不起作用

经理的创作

Directory index = new SimpleFSDirectory(new File(LUCENE_INDEX_PATH)); 
w = new IndexWriter(index, config); 
indexReader = IndexReader.open(w, true); 
manager = new SearcherManager(w, true, null, null); 

更新请求

w.updateDocument(t, document); 
manager.maybeReopen(); // openIfChanged same behavior 
w.commit(); 

搜索请求

IndexSearcher searcher = manager.acquire(); 
try { 
    return performSearch(query, searcher, skip, limit); 
} finally { 
    manager.release(searcher); 
    searcher = null; 
} 

更改刷新到磁盘,但新的搜索请求后,才重新启动应用程序看到他们(娱乐的指数)。看起来像IndexSearcher还指向旧索引。

回答

4

你不需要打开你自己的IndexReader;只需创建SearcherManager(从您的IndexWriter),然后使用它的获取/发布,以获得一个搜索器/阅读器。

使用作者添加/删除文档后,应该调用maybeReopen,然后在下次调用SearcherManager.acquire时,返回的搜索者将反映更改。最好使用后台线程(即不是搜索的线程)索引文档并调用maybeReopen。

您不需要调用IndexWriter.commit以使更改可见 - 仅当您需要持久性时才调用此选项(即,所有更改都安全地在磁盘上并且在OS/JVM崩溃,电源丢失, 9等)。

+0

是的,单独的indexReader只是一个遗留代码,已删除。我确切地知道,当做出更改时,对我来说,最好是在同一个线程中调用maybeReopen。现在是唯一一个按Term来删除文档的问题。文件不会从索引中删除可以请您提出常见的删除方式吗?在索引中可能更好地标记为“已删除”,并且仅更新文档 – user12384512 2012-02-06 18:07:23

+0

如果您调用IndexWriter.deleteDocuments(Term),然后打开新的NRT阅读器(applyAllDeletes传递true),则应该反映删除。你确定你有合适的期限吗? – 2012-04-05 14:26:16

0

如果要使用NRT搜索,请使用以IndexWriter为参数的不同SearcherManager构造函数。检查这篇文章http://blog.mikemccandless.com/2011/11/near-real-time-readers-with-lucenes.html

+0

它不会改变我的任何事情。我尝试了Writer的另一个构造函数 – user12384512 2012-02-06 15:03:10

+0

你确定吗?而且您甚至不需要承诺能够搜索新添加的文档。 – naresh 2012-02-06 15:04:21

+0

是的,我用另一个配置更新了答案 – user12384512 2012-02-06 15:05:26

0

看起来像,我不应该创建IndexReader。

indexReader = IndexReader.open(w, true) 

如果我删除这条线,一切正常。不知道为什么

+0

你在初始代码中需要那个indexReader的地方? – naresh 2012-02-06 16:41:38

+0

因为我开始使用经理,所以无处不在。 – user12384512 2012-02-06 17:24:45