elasticsearch,relation,Solr,Lucene,Parent Child,elasticsearch,Relation" /> elasticsearch,relation,Solr,Lucene,Parent Child,elasticsearch,Relation" />

参考数据的Solr非规范化和更新

参考数据的Solr非规范化和更新,solr,lucene,parent-child,elasticsearch,relation,Solr,Lucene,Parent Child,elasticsearch,Relation,考虑以下情况。我们有一个数据库,将作家和书籍存储在两个单独的表中。有一本书显然提到了写这本书的作者。 对于Solr,我必须将这个结构反规范化为一个大文档,其中每本书都包含作者的详细信息。此索引现在用于查询书籍 系统的一个用户现在决定更新系统中的writer记录。因为很多书都可以与之关联,所以我必须更新Solr中的每个文档,这些文档都包含来自这个writer记录的嵌入数据。这是非常痛苦的,因为据我所知,我必须删除并重新添加所有受影响的文档 有没有更好的办法?如果其中一个引用数据被修改,我需要系统中

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

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


有没有更好的办法?如果其中一个引用数据被修改,我需要系统中索引的近实时更新。

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

此功能在elasticsearch中可用。你可能想看一看,我刚刚写了一篇文章,如果你想知道我的观点,那可能会很有趣。你的问题提醒了我,我在文章中没有提到嵌套文档功能,这也很酷。可以在映射中使用。如果你想知道更多,你可以看看这篇文章。顺便说一句,它正好包含图书/作者示例

Elasticsearch也可以帮助您。您不需要重新索引整个文档,只需通过脚本发送更改。由于它存储了已编制索引的文档,所以它会在内部检索该文档,运行脚本对其进行更新并重新编制索引。这就是lucene内部的工作方式,因为它的索引段只写一次。使用即将发布的Solr4,您可以使用仅提供更改的文档,但据我所知,只有在存储了所有字段的情况下,这才有效。无法从索引中检索未存储的字段


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

要更新Solr中的嵌套类型,可以使用数据导入器和增量导入。上的示例显示了这将如何工作。显然,您需要让solr访问您的数据库。

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