考虑以下情况。我们有一个数据库,可以将作者和书籍存储在两个单独的表中。一本书显然存储了编写本书的作者的参考。 对于Solr,我必须将这个结构反规范化为一个大文档,其中每本书都包含相关作者的详细信息。此索引现在用于查询书籍。
系统的一个用户现在决定更新系统中的编写器记录。因为许多书籍可以与之相关联,所以我必须更新Solr中的每个文档,这些文档都嵌入了来自此编写器记录的数据。这非常痛苦,因为据我所知,我必须删除并重新添加每个受影响的文档。
有没有更好的方法呢?如果其中一个引用的数据被修改,我需要在系统中近乎实时更新索引。
答案 0 :(得分:2)
这将是嵌套文档的完美用例。据我所知,lucene确实支持嵌套文档,但Solr没有,不完全确定此功能的当前状态。
此功能在elasticsearch中可用。你可能想看看它,我刚才写的一篇文章如果你想在我看来想知道what's so cool about elasticsearch就会很有趣。你的问题只是提醒我,我没有在文章中提到嵌套文档功能,这也很酷。您可以在映射中使用nested type。如果您想了解更多信息,可以查看this文章。顺便说一句,它包含书籍/作者的例子。
Elasticsearch还可以帮助您updating documents。您不需要重新索引整个文档,但只通过脚本发送更改。由于它存储了已被索引的source文档,因此它在内部检索它,更新它运行脚本并重新索引它。这就是lucene内部的工作方式,因为它的索引段是一次写入的。使用即将发布的Solr 4,您可以update只提供更改的文档,但据我所知,这仅适用于存储所有字段的情况。无法从索引中检索未存储的字段。
如果我们谈论近实时更新,elasticsearch确实使用Lucene Near Real Time API并每秒自动刷新索引阅读器。 Solr 3还没有使用那些API,但Solr 4确实如此。
答案 1 :(得分:0)
要更新SOLR中的嵌套类型,您可以使用dataimporters和delta导入。 https://wiki.apache.org/solr/DataImportHandler#Delta-Import_Example上的示例显示了这将如何工作。显然,您需要让solr访问您的数据库。