【问题标题】:Concurrent Read & Write in LuceneLucene 中的并发读写
【发布时间】:2014-02-28 08:48:16
【问题描述】:

我有一个需要能够同时读取和写入搜索索引的应用程序。我注意到 lucene 是你不能同时使用 IndexWriter 和 DirectoryReader。基本上:

IndexWriter writer = new IndexWriter(directory, config);
//Add documents here...
writer.commit();

DirectoryReader reader = DirectoryReader.open(writer.getDirectory());
IndexSearcher searcher = new IndexSearcher(reader);     
QueryParser qp = new QueryParser(Version.LUCENE_46,"field", new StandardAnalyzer(Version.LUCENE_46));
qp.setAllowLeadingWildcard(true);
Query q = qp.parse("field:*");

工作正常,而

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, new StandardAnalyzer(Version.LUCENE_46));
IndexWriter writer = new IndexWriter(directory, config);
writer.commit();
DirectoryReader reader = DirectoryReader.open(writer.getDirectory());

//Add documents here

writer.commit();
IndexSearcher searcher = new IndexSearcher(reader);     
QueryParser qp = new QueryParser(Version.LUCENE_46,"field", new StandardAnalyzer(Version.LUCENE_46));
qp.setAllowLeadingWildcard(true);
Query q = qp.parse("field:*");

根本不起作用。

我是否必须在每次提交后重新打开 DirectoryReader?

【问题讨论】:

标签: java concurrency lucene


【解决方案1】:

我们可以看到两个 snippies 之间的主要区别是你从 IndexWriter 获得读者的时间,第一个是在 writer.commit() 之后。


当我们有一个阅读器时,这意味着我们有一个当前索引文件的一次性快照,第二个readerIndexWriter.commit 之前有一个“快照”,结果是@ 987654325@ 基于 reader 将找不到刚刚进行的更改 IndexWriter 或索引未处于一致状态。

所以你应该重新打开 DirectoryReader 。希望这些能有所帮助!:D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多