21

我正在使用 Lucene.Net 来索引和搜索文档,并且我正在使用以下代码来创建或打开索引(如果存在):

IndexWriter writer = new IndexWriter(@"C:\index", new StandardAnalyzer(), !IndexExists);

...

private bool IndexExists
{
    get
    {
        return ??
    }
}

现在,如何IndexExists以简单的方式实现?我不需要抛出任何异常。

4

6 回答 6

38

静态方法 IndexReader.IndexExists(string path) (或其重载之一)似乎非常合适。

于 2009-06-16T14:38:03.710 回答
7

在 < 4.0 是IndexReader.indexExists(org.apache.lucene.store.Directory)

在 > 4.0 是DirectoryReader.indexExists(org.apache.lucene.store.Directory)

于 2013-03-04T11:15:29.937 回答
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)

于 2009-06-17T15:31:02.613 回答
0

我也尝试找到这个anwser但没有成功,这是我在代码中使用的方式:

私有 bool IndexExists { get { return IndexDirectory.FileExists("segments.gen"); } }

于 2011-07-06T14:26:50.193 回答
0

我知道这是一个旧条目,但 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

于 2013-08-09T15:14:42.607 回答
0

哎呀!

这是“纯 Java”Lucene,但它很可能适用于其他品种。

在 Lucene 4.0.0 中,APIDirectoryReader.indexExists()

如果指定目录中存在索引,则返回 true。

但是在 Lucene 4.10.2 中,APIDirectoryReader.indexExists()

如果指定目录中可能存在索引,则返回 true。请注意,如果存在损坏的索引,或者正在提交的索引

...是的,它在句子中间中断。注意我直接从源代码编译了我的 Javadoc,但是在在线 API 中可以看到相同的未完成短语。不仅如此,我查看了Lucene 6.0.0 API,也完全一样。

然而,“返回”短语是:

如果存在索引,则为 true;否则为假

...但我目前相信一个空目录有时会(?)返回true(来自我的单元测试)。反正我是不会相信的。

如果您IndexReader在空目录上创建一个,它的所有方法似乎都将返回而不会引发异常。你可以 go indexReader.numDocs(),这将返回 0,但这并不能证明那里没有索引,只能证明没有Documents。当然,根据您的要求,这可能就足够了。

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

更好的解决方案:

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

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

于 2016-11-03T17:15:43.117 回答