3

使用 StreamingUpdateSolrServer,我使用以下算法将我的庞大数据集重新索引到 SOLR。

Initialize StreamingUpdateSolrServer server = new StreamingUpdateSolrServer(solrServerUrl, numDocsToAddInBatch, numOfThreads);

For each Item…
-->Create document
-->Server.add(document)

When all finished,

server.commit();
server.optimize();

问题:

我的一些项目没有进入 SOLR 索引,但没有生成日志来告诉我发生了什么。

我能够找到大部分文件,但有些文件丢失了。任何日志中都没有错误——而且我有大量的 try/catch 块,其中包含客户端站点上所有 SOLRJ 异常的日志。

4

1 回答 1

2

验证 SOLR WAR 的日志记录没有被隐藏

您肯定要验证 SOLR 服务器日志设置是否隐藏文档未能添加到索引的事实。

因为 SOLR 使用 SLF4J API,所以您的 SOLR 服务器可能会覆盖日志设置,从而允许您在文档未能被索引时看到错误消息。

如果您有自定义的 {solr-war}/WEB-INF/classes/logging.properties,则需要确保设置不会隐藏错误消息。

默认情况下,应自动显示添加项目的错误。因此,如果您在任何时候都没有更改 SOLR 日志设置......您应该在服务器日志文件中的索引期间看到任何错误。

排查文档无法被索引的原因

为了调查这一点,在索引完成后随时遵循验证步骤是有帮助的:

Initialize new log log_fromsolr
Initialize new log log_notfound

    For each Item…
    -->Search SOLR for the item. If SOLR has the object, log each item’s fields into log_fromsolr on a single line into log_fromsolr. This should include the unqiueKey for your document if you have one. 
    -->If document cannot be found in SOLR for this item, write a line to log_notfound with all the fields from the object from the database, also supplying the uniqueKey as the first line.

验证步骤完成后,日志 log_notfound 创建了所有未能添加到索引中的文档的列表。

您可以使用 log_fromsolr 创建的日志来比较进入索引的项目和没有进入索引的项目的文档字段。

验证它不是间歇性问题

有时可能是每次尝试索引时都无法将相同的项目添加到索引中。

如果您在 log_notfound 日志中找到对象,您将需要备份当前的 notfound 日志并从头开始再次运行索引过程。使用 diff 工具查看第一个 notfound 日志和第二个 notfound 日志之间的差异。

当您看到这些文件中存在大量差异时,就会出现间歇性问题(注意:如果在第一次和第二次重新索引之间在数据库中创建新对象,则会出现一些差异)。

如果您的问题是间歇性的,那么它肯定指向您的 SOLR 事务未正确提交的应用程序代码。

每次索引时总是会丢失相同的文档

此时,我们必须比较从 SOLR 索引中找到的文档与未进入 Lucene 索引的文档。通常,对象的逐个字段比较将开始转向一些可疑值,这些值可能会在将文档添加到索引时导致问题。

尝试消除所有可疑字段,然后再次重新索引整个内容。查看文档是否仍然无法被索引。如果这行得通,您将需要重新引入已删除的字段,看看您是否可以查明问题所在。

于 2012-06-04T14:39:31.213 回答