- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试索引从 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 :-
One of the principles in Lucene since day one is the write-once policy. We never write a file twice. When you add a document via IndexWriter it gets indexed into the memory and once we have reached a certain threshold (max buffered documents or RAM buffer size) we write all the documents from the main memory to disk; you can find out more about this here and here. Writing documents to disk produces an entire new index called a segment. Now, when you index a bunch of documents or you run incremental indexing in production here you can see the number of segments changing frequently. However, once you call commit Lucene flushes its entire RAM buffer into segments, syncs them and writes pointers to all segments belonging to this commit into the SEGMENTS file.
如果文档已经存在于 Solr 中,它将被覆盖(由唯一 id 确定)。
因此,您的搜索可能仍然可以正常工作,但除非您提交,否则无法搜索最新的文档。
此外,一旦您打开 indexwriter,它将获得索引的锁,您应该关闭 writer 以释放锁。
关于java - org.apache.lucene.store.LockObtainFailedException : Lock obtain timed out:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15470674/
我们有一个在负载均衡器后面运行的 Grails 项目。服务器上运行着三个 Grails 应用程序实例(使用单独的 Tomcat 实例)。每个实例都有自己的可搜索索引。因为索引是分开的,所以自动更新不足
我的应用程序通过 REST 从多个客户端执行非常频繁的 solr 写入。我通过使用“commitWithin”属性来使用自动提交功能。 LockObtainFailedException 在使用几天后
我正在使用 Crawler Controller 来抓取中型网站的所有页面。它随机抓取 2-3 个页面,然后导致 IndexWriter 上的锁定 Directory dir = FSDirector
我在谷歌上搜索了很多。大多数这些问题是由 JVM 崩溃后遗留的锁引起的。这不是我的情况。 我有一个包含多个读者和作者的索引。我正在尝试进行质量索引更新(删除和添加 - 这就是 lucene 进行更新的
我正在使用 App Engine 标准环境,我的服务使用 Search API . 所以基本上在我的服务中我会做类似的事情: IndexSpec indexSpec = IndexSpec.newBu
我正在 Azure 应用服务上运行单个(未缩放)solr 实例。应用服务运行 Java 8 和 Jetty 9.3 容器。 一切都运行得很好,但是当 Azure 决定切换到另一个 VM 时,有时 JV
我正在尝试索引从 tomcat 服务器获取的大量日志文件。我已经编写了代码来打开每个文件,为每一行创建一个索引,然后使用 Apache lucene 存储每一行。所有这些都是使用多线程完成的。 当
在 Google APP engine , 我正在使用 Lucene 4.1 . 我能够在本地生成索引文件,但在谷歌服务器上我收到以下异常(尽管相同的代码在本地机器上运行良好): org.apache
我刚收到这个错误错误日志:org.apache.lucene.store.LockObtainFailedException:锁获取超时:NativeFSLock@/var/database/sche
我是一名优秀的程序员,十分优秀!