如何识别文件夹中是不是存在 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,但这并不能证明那里没有索引,只能证明没有Documents。当然,这取决于您的要求。

同样,您可以从这样的IndexReader 创建一个IndexSearcher,也可以创建一个IndexWriter。这些都不会对空目录有任何明显的问题。

更好的解决方案:

    try 
        directoryReader = DirectoryReader.open( fsDir );
     catch ( org.apache.lucene.index.IndexNotFoundException e) 
        ...
    

据我所知,这似乎是可靠的。

【讨论】:

以上是关于如何识别文件夹中是不是存在 Lucene.Net 索引?的主要内容,如果未能解决你的问题,请参考以下文章

使用Lucene.Net做一个简单的搜索引擎-全文索引

ifstream:如何判断指定文件是不是不存在

使用Lucene.Net实现全文检索

框架:Lucene.net

Lucene .NET 搜索不返回任何结果

iPhone 上是不是存在 hosts 文件?如何改变它? [关闭]