【问题标题】:Lucene: unstored fieldsLucene:未存储的字段
【发布时间】:2009-08-22 14:45:27
【问题描述】:

我只是想知道何时存在读取 Lucene 索引中未存储但已编入索引的字段的方法?我需要,因为我有一个索引,我将遍历索引中的所有文档以应用一些分析,我需要稍后更新这些文档,为了更新我需要先删除以及何时重新插入文档。问题是我不知道何时可以读取未存储的字段以便将它们原样复制到更新的文档中。

【问题讨论】:

    标签: search-engine lucene


    【解决方案1】:

    您可以使用Luke 轻松查看索引。 编辑:我想我现在明白了这个问题。 Here 是 Andrzej Bialecki 提出的解决方案,它说:创建一个仅包含新/修改字段的文档的索引。 原始索引中的每个文档都有一个带有计算字段的共轭文档。使用ParallelReader 搜索具有原始字段和计算字段的文档对。

    【讨论】:

    • 好吧,就我而言,我做不到,因为我想在完成数据集的索引后更新索引。实际上我需要做一些链接分析,所以我需要索引一次,分析后更新其中的文档。
    • @Artem:请解释为什么你不能这样做。为什么不执行以下操作: 1. 索引您的数据集,将结果放入索引 A。 2. 遍历 A,进行链接分析,并将结果存储在索引 B 中。B 将包含您从 A 逐字复制的任一字段,或者分析结果,我认为是新的领域。对于 A 中的每个文档,您将在 B 中拥有一个镜像文档。 3. 关闭索引 A 和 B。 4. 将 A 复制到备份。 5. 使用索引 B 满足您的所有检索需求。如果我遗漏了什么,请告诉我。
    • @Yuval F:这行不通,因为无法检索未存储在索引 A 中的任何字段以复制到索引 B 中,因此它们最终会从索引 B 中丢失。 Luke (v0.1) 9.2) 确实有能力重建未存储的字段,从而获得其值,但这是使用索引统计的蛮力方法,实际上可能会获得与原始索引值不同的值。将字段从一个索引复制到另一个索引的唯一方法是使其成为原始索引中的存储字段。
    • @adrianbanks:谢谢。请参阅我的编辑建议另一种选择。
    【解决方案2】:

    未存储的字段就是这样 - 未存储。无法从索引中检索它们的内容。

    为了做到你所说的,你有几个选择:

    • 存储每个字段,以便您可以从现有文档创建新文档
    • 如果您的未存储字段很大(即文本文件的内容),则在索引中存储指向原始内容的指针(即其文件路径)。创建新文档时,从现有文档中读取此指针,从原始源(即从文本文件)中获取字段内容,然后将其未存储地添加到新文档中
    • 如果您不更改未存储的字段,则可以检索现有文档,更新其其他字段,然后将其放回索引中。不过,这可能只能在更高版本的 Lucene 中实现(v2.2 以上)。 编辑:尝试过此选项后,它不起作用 - 请参阅下面的评论。

    最终,如果您需要获取未存储字段的值,则必须将其存储。

    【讨论】:

    • 我很好奇你提到的最后一个选项,确实我不会更新内容,我唯一需要做的就是根据其他字段进行一些分析更新它们,仅此而已。所以我不确定我是否理解我需要怎么做。根据您所说,在索引中找到文档并仅更新我感兴趣的存储字段就足够了,但是接下来我需要做什么?只需将更新后的文档按原样添加到索引中?那么它将如何与以前未存储的字段连接呢?
    • 道歉。刚刚尝试了第三个选项,当您从IndexReader 检索文档时,似乎未存储的字段已从文档中删除。正如我所说的那样,将重新添加缺少未存储字段的文档,因此这种方法实际上并不是一个有效的选择。看起来您必须存储该字段的值才能执行您想要执行的操作。 [更新答案以反映这一点]
    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 2012-09-27
    • 2014-01-25
    • 2019-07-06
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多