【问题标题】: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?我不需要抛出任何异常。

【问题讨论】:

    标签: indexing full-text-search lucene.net search full-text-indexing


    【解决方案1】:

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

    【讨论】:

    【解决方案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) {
                ...
            }
        

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

        【讨论】:

          猜你喜欢
          • 2011-05-25
          • 1970-01-01
          • 1970-01-01
          • 2014-01-26
          • 1970-01-01
          • 1970-01-01
          • 2010-11-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多