java - Lucene SearcherManager 也许刷新写入索引文件?
问题描述
我正在使用 Lucene 8.5,这就是我现在在我的应用程序中所做的:
- 使用
IndexWriter
. - 调用
SearcherManager.maybeRefreshBlocking()
(SearcherManager
使用相同创建IndexWriter
)。 - 然后 tar 包含文件系统上索引文件的目录。
然后我会收到这样的错误:
tar: ./indexes/_i_Lucene85FieldsIndex-doc_ids_10.tmp: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.
所以这告诉我在 tar 操作开始时刷新调用还没有完成。我需要一些澄清和帮助:
maybeRefresh()
/maybeRefreshBlocking()
是异步调用,调用它会修改索引文件吗?IndexWriter.commit()
愚蠢的问题,但是除了commit
同步调用之外,还有什么不同之处呢?- 我该怎么做才能确保索引完全“刷新”?换句话说,索引段文件等不再被更新。
我确实尝试将ReferenceManager.RefreshListener
(https://lucene.apache.org/core/8_5_0/core/org/apache/lucene/search/ReferenceManager.RefreshListener.html)添加到SearcherManager
实例并覆盖afterRefresh(boolean)
,但它似乎在之后被调用尝试而不是实际完成时,因为我仍然遇到上述问题。
searcherManager.addListener(new ReferenceManager.RefreshListener() {
@Override
public void beforeRefresh() {
refreshing = true;
}
@Override
public void afterRefresh(boolean didRefresh) {
if (didRefresh) {
refreshing = false;
}
}
});
任何帮助和建议将不胜感激!
解决方案
MaybeRefresh()/maybeRefreshBlocking() 是异步调用,调用它会修改索引文件对吧?
否。这两种方法会刷新与 关联的读取器,SearcherManager
如果自当前使用的读取器打开后发生了任何已提交或未提交的写入SearcherManager
。这些方法不会将索引更改写入磁盘。
更新:当我说“这些方法现在确实将索引更改写入磁盘”时,我不太正确。确实他们没有提交任何更改,但事实证明他们确实将索引刷新到磁盘,从而创建了一个新的未提交段。
愚蠢的问题,但是除了提交是同步调用之外,还有什么让这个调用与 IndexWriter.commit() 不同?
不是一个愚蠢的问题。commit() 实际上会将任何未提交的写入操作写入磁盘。对索引的写入最初是未提交的,并在内存中缓冲,直到调用 commit()。当调用 commit() 时,这些索引更改将写入新的索引段。
我该怎么做才能确保索引完全“刷新”?换句话说,索引段文件等不再被更新。
调用'IndexWriter.commit()'
推荐阅读
- python - Pandas 通过为数据帧之间的每个重复行仅删除一行来合并两个数据帧
- php - 如何在一个 Query PHP 中加入 mongoDB 中的多个集合以获取具体数据
- sql - PostgreSQL DROP ROLE 抛出错误:无法删除角色,因为它是数据库系统需要的
- javascript - 如何选择特定的 ID 来做某事?
- python-3.x - 没有为所有循环参数运行python multiprocessing for loop
- discord - 删除消息命令,仅适用于所有者、管理员和版主
- freertos - FreeRTOS - 堆栈增加的原因?
- vb.net - 单击时搜索按钮不起作用
- c - 有没有办法在#include 中使用 char 数组/变量
- node.js - 在 CPanel(共享主机)上运行 Express Server