【问题标题】:Solr denormalization and update of referenced dataSolr 非规范化和引用数据的更新
【发布时间】:2012-09-27 08:57:48
【问题描述】:

考虑以下情况。我们有一个数据库,将作家和书籍存储在两个单独的表中。一本书显然存储了对写这本书的作者的引用。 对于 Solr,我必须将此结构非规范化为一个大文档,其中每本书都包含相关作者的详细信息。该索引现在用于查询书籍。

系统的一位用户现在决定更新系统中的写入者记录。因为很多书都可以与之关联,所以我必须更新 Solr 中包含来自该作者记录的嵌入数据的每个文档。这非常痛苦,因为据我所知,我必须删除并重新添加每个受影响的文档。

有没有更好的方法来做到这一点?如果引用的数据之一被修改,我需要对系统中的索引进行近乎实时的更新。

【问题讨论】:

    标签: solr lucene parent-child elasticsearch relation


    【解决方案1】:

    这将是嵌套文档的完美用例。据我所知,lucene 确实支持嵌套文档,但 Solr 不支持,不完全确定此功能的当前状态。

    不过,此功能在 elasticsearch 中可用。你可能想看看它,我刚写的一篇文章如果你想知道what's so cool about elasticsearch我认为会很有趣。你的问题让我想起了我的文章中没有提到嵌套文档功能,这也很酷。您可以在映射中使用nested type。如果您想了解更多信息,可以查看this 文章。顺便说一句,它包含书籍/作者示例。

    Elasticsearch 还可以在 updating documents 时为您提供帮助。您不需要重新索引整个文档,只需通过脚本发送更改。由于它存储了已被索引的source 文档,因此它在内部检索它,更新它运行脚本并重新索引它。这就是 lucene 在内部的工作方式,因为它的索引段是一次性写入的。使用即将发布的 Solr 4,您可以 update 仅提供更改的文档,但据我所知,这仅在存储所有字段时才有效。未存储的字段无法从索引中检索。

    如果我们谈论的是近实时更新,elasticsearch 确实使用 Lucene 近实时 API 并每秒自动刷新索引读取器。 Solr 3 尚未使用这些 API,但 Solr 4 使用了。

    【讨论】:

    • 谢谢,稍后我会阅读您的博文。嵌套文档看起来像我需要的东西,只是不知道它存在。但是我仍然不知道它如何加快嵌套文档更新过程。我必须进一步调查。
    • 我们的目标是只索引作者一次,并且书籍只指向他们而不是实际包含他们。这样您只需更新每个作者一次。
    • 谢谢,这看起来很有希望。那我就拿 ES 做飞行员吧:)
    • 这个结构有多复杂?问题中的示例是我能想到的最简单的示例。在我们的系统中,记录可以以非常复杂的方式相互引用。甚至书籍之间的引用也是允许的。 ES 能处理吗?
    • 好吧,您需要考虑到搜索引擎不是关系数据库。您需要以某种方式将数据扁平化一点。我想说一切都取决于您的用例和您想要查询数据的方式(考虑到关系)。
    【解决方案2】:

    为了更新 SOLR 中的嵌套类型,您可以使用数据导入器和增量导入。 https://wiki.apache.org/solr/DataImportHandler#Delta-Import_Example 上的示例显示了它是如何工作的。显然,您需要让 solr 访问您的数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-08
      • 2012-09-19
      • 2017-06-17
      • 2023-03-13
      • 2011-09-24
      • 2016-10-22
      • 2017-03-01
      • 2017-10-23
      相关资源
      最近更新 更多