索引频繁更新的FieldCache

2023-12-02

Hi
我的 lucene 索引经常使用新记录进行更新,我的索引中有 5,000,000 条记录,并且我正在使用 FieldCache 缓存我的数字字段之一。但是更新索引后,需要时间再次重新加载 FieldCache(我重新加载缓存,因为文档说 DocID 不可靠),所以如何通过仅将新添加的 DocID 添加到 FieldCache 来最小化这种开销,因为此功能变成了我的瓶颈应用。


IndexReader reader = IndexReader.Open(diskDir);
int[] dateArr = FieldCache_Fields.DEFAULT.GetInts(reader, "newsdate"); // This line takes 4 seconds to load the array
dateArr = FieldCache_Fields.DEFAULT.GetInts(reader, "newsdate"); // this line takes 0 second as we expected
// HERE we add some document to index and we need to reload the index to reflect changes

reader = reader.Reopen();
dateArr = FieldCache_Fields.DEFAULT.GetInts(reader, "newsdate"); // This takes 4 second again to load the array

我想要一种机制,通过仅将新添加的文档添加到数组中的索引来最小化这个时间,有一种这样的技术http://invertedindex.blogspot.com/2009/04/lucene-dociduid-mapping-and-payload.html提高性能,但它仍然加载我们已有的所有文档,并且我认为如果我们找到一种仅将新添加的文档添加到数组中的方法,则无需重新加载所有文档


FieldCache 使用对索引读取器的弱引用作为其缓存的键。 (通过调用IndexReader.GetCacheKey尚未废弃。)标准调用IndexReader.Open with a FSDirectory将使用一组读者,每个细分市场都有一个读者。

您应该始终将最里面的读取器传递给 FieldCache。查看ReaderUtil对于一些辅助工具来检索包含在其中的单个读者的文档。文档 ID 不会在段内更改,当将其描述为不可预测/易失性时,它们的意思是它会在两次索引提交之间更改。可能会发生已删除的文档、已合并片段等操作。

提交需要从磁盘中删除该段(合并/优化),这意味着新的读取器不会拥有池化的段读取器,并且一旦所有旧读取器关闭,垃圾收集就会将其删除。

永远,永远,打电话FieldCache.PurgeAllCaches()。它用于测试,而不是生产用途。

2011-04-03 添加;使用子阅读器的示例代码。

var directory = FSDirectory.Open(new DirectoryInfo("index"));
var reader = IndexReader.Open(directory, readOnly: true);
var documentId = 1337;

// Grab all subreaders.
var subReaders = new List<IndexReader>();
ReaderUtil.GatherSubReaders(subReaders, reader);

// Loop through all subreaders. While subReaderId is higher than the
// maximum document id in the subreader, go to next.
var subReaderId = documentId;
var subReader = subReaders.First(sub => {
    if (sub.MaxDoc() < subReaderId) {
        subReaderId -= sub.MaxDoc();
        return false;
    }

    return true;
});

var values = FieldCache_Fields.DEFAULT.GetInts(subReader, "newsdate");
var value = values[subReaderId];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

索引频繁更新的FieldCache 的相关文章

随机推荐

  • 隐藏 ViewController 后实例化按钮不起作用

    我刚刚发现这个非常奇怪的问题 我有这个button这是触发这个function objc func vergessenTapped let forgotPasswordVC self storyboard instantiateViewCo
  • 查找具有 n 个元素的表的最佳列和行大小以及其比例的给定范围

    我正在寻找一种从 n 个元素创建表格的最佳方法 以便理想情况下没有空单元格 但同时表格尺寸列 行的比例变得尽可能接近 1 当然 如果 n 是平方数 那么就很容易 cols rows sqrt n 如果 n 是素数 那么很明显会有空单元格 所
  • 在 Github 操作中获取修改后的文件

    我的存储库中有 2 个 Github Actions 工作流程 其中一个步骤需要获取 PR 中已修改的所有文件 删除的文件除外 我在第一个中使用这个 on pull request branches main jobs get files
  • Java 方法有排序约定吗? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有一个大型类 大约 40 个方法 它是我将作为课程作业提交的包的一部分 目前 这些方法在公用 私有等方面相当混乱 我想以合理的方式对它们进行排序 有这样做的标准方法吗 例如 通
  • 带有动态类名的 PHP 命名空间

    想知道其他人在使用 PHP 5 3 命名空间类的新功能时是否遇到过这个问题 我正在生成一个动态类调用 利用一个单独的类来定义应用程序中的用户类型 基本上 类定义器采用类型的整数表示形式并解释它们 返回一个包含类名的字符串 该类名将被称为该用
  • 将 git 子模块中的更改推送到主模块,但不推送到子模块

    我有一个 git 项目 A 它使用来自 Github 的子模块 B 我无法推送到 Github 项目 B 因为它不是我的 我想在B中做一个小的改变 不推送到远程B 因为我无法推送 但应该推送到A 所以当有人使用A时 他应该能够看到我的更改
  • Python递归函数错误:“超出最大递归深度”[重复]

    这个问题在这里已经有答案了 我使用以下代码解决了 Project Euler 的问题 10 该代码通过暴力破解 def isPrime n for x in range 2 int n 0 5 1 if n x 0 return False
  • “缩进中制表符和空格的使用不一致”[重复]

    这个问题在这里已经有答案了 我正在尝试在 Python 3 2 中创建一个应用程序 并且一直使用制表符进行缩进 但即使是编辑器也会将其中一些更改为空格 然后当我尝试运行时打印出 缩进中制表符和空格的使用不一致 该程序 如何将空格改为制表符
  • 如何在spring data @Query中使用属性

    我无法设法将 application yml 中的属性注入到 spring data Query 中 以下结果会导致 EL1008E 错误 public interface MyRepository extends JpaRepositor
  • 如何通过PHP和Linux使用pdo连接mssql?

    我正在尝试使用以下代码建立新的 PDO 连接 new PDO mssql driver Server serverName Database databaseName username password array PDO ATTR PER
  • 组合框问题:无法绑定到新值成员

    我创建了一个作为用户控件的组合框 它实际上由标签 组合框和文本框组成 我正在尝试将数据集绑定到组合框数据源 但我不断收到有关 ValueMember Display 成员的错误消息 Cannot bind to the new displa
  • 如何在屏幕底部添加工具栏?

    我是新来的 我需要你的帮助 因为我不知道一些事情 例如 我为我的应用程序放置了一个工具栏 而不是在屏幕顶部放置操作栏 现在我想在底部放置一个工具栏 那么我该怎么做呢 工具栏是正确的方式 并且它兼容android 4 0 谢谢您的回答 编辑
  • 表示任何双精度值所需的最大字符长度是多少?

    当我将无符号 8 位 int 转换为字符串时 我知道结果始终最多为 3 个字符 对于 255 而对于有符号 8 位 int 我们需要 4 个字符 例如 128 现在我真正想知道的是浮点值也是一样的 将任何 双精度 或 浮点 值表示为字符串所
  • openssl ssl 加密

    我想讨论一下openssl的写入和读取方法 假设我有一个如下所示的数据结构 my header PAYLOAD not encrypted encrypted I think the proper al
  • itextsharp:如何找到矩形的填充颜色

    我按照 ItextSharp 示例获取图形结构 使用代码获取矩形坐标 class VectorGraphicsListener IExtRenderListener public void ModifyPath PathConstructi
  • 使用“Codable”设置属性值无法通过继承起作用

    我无法设置b子类中的属性 它是继承自的父类Codable 这似乎运作良好 我觉得我错过了一些非常明显的东西 但我很难只见树木 下面是我的问题的游乐场示例 b尽管设置为 但仍为 010 传入的是子类 但可以设置父类属性 非常奇怪 class
  • 暂停命令行 python 程序的最简单方法?

    假设我有一个 python 程序 它会输出文本行 例如 while 1 print This is a line 允许用户按下键盘上的某个键来暂停循环 然后在再次按下时恢复 最简单的方法是什么 但如果没有按下任何按钮 它应该自动继续 我希望
  • 无法在 VSCode 中运行 Jupyter Notebook - Vanilla Python、Windows 10

    我的 Windows 10 计算机上安装了现有的普通 Python 但我不想重新安装 Anaconda 当尝试在 vscode 中运行 ipynb 文件中的代码时 出现以下错误 Error Jupyter cannot be started
  • 在 bash 程序中获取“[:=:预期一元运算符”[重复]

    这个问题在这里已经有答案了 我一直在开发一个示例 bash 程序来练习 bash 脚本编写 但每当我尝试使用正确的变量运行它时 它都会输出 预期的一元运算符 并退出 bin bash clear i P PASSWORD echo Plea
  • 索引频繁更新的FieldCache

    Hi我的 lucene 索引经常使用新记录进行更新 我的索引中有 5 000 000 条记录 并且我正在使用 FieldCache 缓存我的数字字段之一 但是更新索引后 需要时间再次重新加载 FieldCache 我重新加载缓存 因为文档说