3

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

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

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

4

2 回答 2

2

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

不过,此功能在 elasticsearch 中可用。你可能想看看它,如果你想知道我认为elasticsearch 有什么很酷的话,我刚刚写的一篇文章会很有趣。你的问题让我想起了我的文章中没有提到嵌套文档功能,这也很酷。您可以在映射中使用嵌套类型。如果你想了解更多,可以看看这篇文章。顺便说一句,它完全包含书籍/作者的例子。

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

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

于 2012-09-27T10:19:57.237 回答
0

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

于 2013-08-22T06:53:46.463 回答