我正在尝试索引从 tomcat 服务器获取的大量日志文件。我已经编写了打开每个文件的代码,为每一行创建一个索引,然后使用 Apache lucene 存储每一行​​。所有这些都是使用多线程完成的。

当我尝试使用此代码时出现此异常

org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out:

代码
  if (indexWriter.getConfig().getOpenMode() == IndexWriterConfig.OpenMode.CREATE)
        {
          // New index, so we just add the document (no old document can be there):
           System.out.println("adding " + path);

                indexWriter.addDocument(doc);

       } else {
          // Existing index (an old copy of this document may have been indexed) so
       // we use updateDocument instead to replace the old one matching the exact
           // path, if present:
            System.out.println("updating " + path);

                indexWriter.updateDocument(new Term("path", path), doc);

          }
        indexWriter.commit();
        indexWriter.close();

现在我想既然我每次都提交索引,它可能会导致写锁。所以我删除了 indexWriter.commit(); :
if (indexWriter.getConfig().getOpenMode() == IndexWriterConfig.OpenMode.CREATE)
    {
      // New index, so we just add the document (no old document can be there):
       System.out.println("adding " + path);

            indexWriter.addDocument(doc);

   } else {
      // Existing index (an old copy of this document may have been indexed) so
   // we use updateDocument instead to replace the old one matching the exact
       // path, if present:
        System.out.println("updating " + path);

            indexWriter.updateDocument(new Term("path", path), doc);

      }

    indexWriter.close();

现在我也不异常(exception)

问:所以我的问题是为什么 indexWriter.commit();导致异常。即使我删除 indexWriter.commit();我在搜索时没有遇到任何问题。那就是我得到了我想要的确切结果。那为什么要使用 indexWriter.commit(); ?

最佳答案

简而言之,它类似于 DB 提交,除非您提交事务,否则添加到 Solr 的文档只是保存在 Memory 中。只有在提交时,文档才会被持久化在索引中。
如果当文档在内存中时 Solr 崩溃,您可能会丢失这些文档。

Explanation :-



如果该文档已存在于 Solr 中,则它只会被覆盖(由唯一 id 确定)。
因此,您的搜索可能仍然正常工作,但除非您提交,否则无法搜索最新的文档。

此外,一旦您打开和 indexwriter 它将获得对索引的锁定,您应该关闭 writer 以释放锁定。

10-06 09:40