如何识别文件夹中是不是存在 Lucene.Net 索引?
Posted
技术标签:
【中文标题】如何识别文件夹中是不是存在 Lucene.Net 索引?【英文标题】:How to identify if a Lucene.Net Index exists in a folder?如何识别文件夹中是否存在 Lucene.Net 索引? 【发布时间】:2010-11-03 08:41:55 【问题描述】:我正在使用 Lucene.Net 来索引和搜索文档,并且我正在使用以下代码来创建或打开索引(如果存在):
IndexWriter writer = new IndexWriter(@"C:\index", new StandardAnalyzer(), !IndexExists);
...
private bool IndexExists
get
return ??
现在,如何以简单的方式实现IndexExists
?我不需要抛出任何异常。
【问题讨论】:
【参考方案1】:静态方法 IndexReader.IndexExists(string path)(或其重载之一)似乎非常合适。
【讨论】:
现在称为DirectoryReader.indexExists
:lucene.apache.org/core/8_1_0/core/org/apache/lucene/index/…【参考方案2】:
在 IndexReader.indexExists(org.apache.lucene.store.Directory)
在 > 4.0 是DirectoryReader.indexExists(org.apache.lucene.store.Directory)
【讨论】:
【参考方案3】:您可以只使用不带布尔参数的构造函数。如果有一个现有的索引,它将打开一个现有的索引,如果不存在,则创建一个新的索引。
Java 文档链接(Lucene.Net 相同):http://lucene.apache.org/java/2_3_1/api/org/apache/lucene/index/IndexWriter.html#IndexWriter(org.apache.lucene.store.Directory, org.apache.lucene.analysis.Analyzer)
【讨论】:
Lucene.net 没有这个重载。 Lucene.Net 的哪个版本缺少重载?它在 2.4 中。 我使用的是“纯 Java”Lucene。IndexWriter
在 4.10.+ 只有一个构造函数。但我不明白你如何从你的解决方案中得到提问者想要的东西:找出那里是否已经有索引。【参考方案4】:
我也尝试找到这个 anwser,但没有成功,这是我在代码中使用的方式:
私有布尔索引存在 得到 返回 IndexDirectory.FileExists("segments.gen");
【讨论】:
聪明...可能是目前最好的方法(请参阅我的回答:4.10.+ 自 4.0.+ 起更改了DirectoryReader.indexExists()
的规范)。但是,当然,我相信您知道,您的解决方案很容易受到版本更改的影响。每个新版本都必须检查!【参考方案5】:
我知道这是一个旧条目,但 Sean Carpenter 发布的内容是完全正确的,即使在最新版本的 Lucene .NET 中也存在此构造函数。 IndexWriter 类的文档可以在这里找到: http://lucenenet.apache.org/docs/3.0.3/d2/d1d/class_lucene_1_1_net_1_1_index_1_1_index_writer.html#af4620c14320934601058e0e9cac9bfab
【讨论】:
【参考方案6】:哎呀!
这是“纯 Java”Lucene,但它很可能适用于其他品种。
在 Lucene 4.0.0 中,DirectoryReader.indexExists()
的 API 说
如果指定目录中存在索引,则返回 true。
但在 Lucene 4.10.2 中,DirectoryReader.indexExists()
的 API 说
如果指定目录中可能存在索引,则返回 true。 请注意,如果存在损坏的索引,或者如果索引在 提交
...是的,它在句子中间中断了。注意我直接从源代码编译了我的 Javadoc,但是在在线 API 中可以看到同样的未完成的短语。不仅如此,我看了一下Lucene 6.0.0 API,也是一模一样。
然而,“返回”短语是:
如果索引存在则为真;否则为假
...但我目前相信空目录有时会(?)返回true
(来自我的单元测试)。反正我是不会相信的。
如果您在空目录上创建IndexReader
,它的所有方法似乎都将返回而不会引发异常。你可以去indexReader.numDocs()
,这将返回0,但这并不能证明那里没有索引,只能证明没有Document
s。当然,这取决于您的要求。
同样,您可以从这样的IndexReader
创建一个IndexSearcher
,也可以创建一个IndexWriter
。这些都不会对空目录有任何明显的问题。
更好的解决方案:
try
directoryReader = DirectoryReader.open( fsDir );
catch ( org.apache.lucene.index.IndexNotFoundException e)
...
据我所知,这似乎是可靠的。
【讨论】:
以上是关于如何识别文件夹中是不是存在 Lucene.Net 索引?的主要内容,如果未能解决你的问题,请参考以下文章