Solr文档的频繁更新 - 效率/可伸缩性问题

时间:2011-11-16 15:25:20

标签: search solr full-text-search solandra

我有一个Solr索引,文档字段类似于:

id, body_text, date, num_upvotes, num_downvotes

在我的应用程序中,创建的文档包含一些整数id和一些body_text(最多500个字符)。日期设置为输入时间,num_upvotesnum_downvotes从0开始。

我的应用程序为用户提供了对上述内容进行upvote和downvote的能力,以及我想在Solr而不仅仅是DB中跟踪这一点的原因是我希望能够考虑upvotes和downvotes的数量进入我的search

这是一个问题,因为您不能简单地更新solr文档(即up_votes的增量数量),您必须替换整个文档,这可能是相当低效的,因为它需要命中我的数据库来获取所有相关数据再次。

我意识到解决方案可能需要不同的数据布局,或者可能需要多个索引(尽管我不知道您是否可以在solr核心之间进行查询/评分)。

是否有人能够就如何解决这个问题提出任何建议?

4 个答案:

答案 0 :(得分:4)

我在类似问题中使用的解决方案是更新数据库中的信息,并使用自上次更新后修改的文档每十分钟执行一次SOLR更新/插入。

同样每天晚上,当我没有太多流量时,我会进行索引优化。 每次导入后,我在SOLR配置中设置了一些预热查询。

在我的SOLR索引中,我有大约150万个文档,每个文档有24个字段,整个文档大约有2000个字符。 我每隔10分钟更新一次约500个文档的索引(没有优化索引),我做了大约50个热门查询,包括最常见的方面,大多数使用过滤查询和自由文本搜索。

我不会对性能产生负面影响。 (至少它是不可见的) - 我的查询在0.1秒内平均运行。 (在每10分钟更新一次之前,平均查询为0.09秒)

稍后编辑:

在此次更新期间我没有遇到任何问题。我总是从数据库中获取文档并使用Unique键将它们插入SOLR。如果文档存在于SOLR中,它将被替换(这就是我所说的更新)。

更新SOLR永远不会超过3分钟。实际上我每次更新后都会休息10分钟。所以我开始更新索引,等待它完成,然后我再等10分钟重新开始。

我没看过整个晚上的表现,但对我来说这并不重要,因为我希望在用户访问高峰期间获得最新的数据信息。

答案 1 :(得分:2)

Join功能可以帮助您。然后,您可以将上/下投票存储在单独的文档中。

坏消息是你需要等到Solr 4,除非你很舒服地使用后备箱构建。

答案 2 :(得分:1)

如果您只是要更新上/下投票。不要回到数据库,只需为您的应用程序使用适当的Solr Client并从索引中提取文档,根据需要设置上/下值,然后将文档重新插入索引。

答案 3 :(得分:0)

SOLR中没有解决您的问题的方法。您遇到了数据库问题,并且正在尝试使用搜索引擎解决此问题。

处理此问题的最佳方法是保留一个redis数据库,记录来自SOLR的document id和上/下投票计数。然后,您的应用可以在显示之前合并来自两个来源的数据。