5

我有一个带有文档字段的 Solr 索引,例如:

id, body_text, date, num_upvotes, num_downvotes

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

我的应用程序使用户能够对上述内容进行投票和否决,而我想在 Solr 而不仅仅是数据库中跟踪这一点的原因是我希望能够考虑到我的search.

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

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

有没有人能够就如何解决这个问题提供任何建议?

4

4 回答 4

4

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

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

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

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

后期编辑:

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

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

我没有看一夜之间的表现,但对我来说这无关紧要,因为我想在用户访问高峰期间获得最新的数据信息。

于 2011-11-18T11:45:00.800 回答
2

加入功能将在这里为您提供帮助。然后您可以将赞成/反对票存储在单独的文档中。

坏消息是您需要等到 Solr 4,除非您对使用主干构建感到自在。

于 2011-11-16T16:07:17.340 回答
1

如果您只想更新赞成/反对票。无需返回数据库,只需为您的应用程序使用适当的Solr 客户端并从索引中提取文档,根据需要设置向上/向下值,然后将文档重新插入索引中。

于 2011-11-16T15:45:35.520 回答
0

SOLR中没有解决您的问题的方法。你有一个数据库问题,你正试图用搜索引擎解决它。

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

于 2011-11-18T04:41:40.703 回答