SOLR中的动态数据(如计数,查看数量等) - NRT与Redis?

时间:2015-12-11 10:38:16

标签: mysql solr lucene redis

我们正在创建一个包含帖子的网络应用程序(比如FB或说Youtube)。对于稳定的数据部分(即方面,搜索结果及其内容),我们计划使用SOLR。

我们应该对数据的不稳定部分使用什么(即动态和易变的内容,如类似计数,评论计数,Viewcounts)?

选项1)Redis

如何存储"动态"不同数据存储中的数据(如Redis)?因此,每次刷新计数时,我都不必将数据重新索引到SOLR中。因此,仅当新帖子添加到站点时才会触发SOLR索引,并且永远不会触发用户对帖子的任何活动。

旁注: - 我还在https://github.com/sematext/solr-redis

查看了SOLR-Redis插件

该插件看起来不错,但不确定该插件是否可用于获取存储在Redis中的数据作为solr结果集的一部分,即在docs中。描述看起来更像是Redis数据可以在函数查询中用于提升,排序等。任何人都有这方面的经验吗?

选项2)具有软提交的SOLR NRT

我们将依赖内置的NRT功能。我们假设我们每秒进行一次软提交,每10秒进行一次硬提交。假设在数百个帖子上在网站上创建了大量的动态数据,例如: 100000个喜欢10000个帖子。因此,这意味着每秒对10000行进行软提交。然后每隔10秒硬提交那么多行。这不是太过分了吗?

首选哪个选项?您如何在可扩展性,维护,可行性,最佳实践等方面比较两种选择?任何真实的经历或文章链接?

非常感谢!

P.S。 EFF(外部文件字段)不是一个选项,因为我读到该文件中的数据只能用于函数查询,不能作为文档的一部分返回。

2 个答案:

答案 0 :(得分:1)

我建议您使用redis来获取经常更改的数据。关于Solr软件提交要记住的一件事是它们使一些缓存数据无效,如果你有很多缓存数据;打开一个新的搜索器并构建新的缓存可能会比你喜欢的时间更长。

Solr非常适合全文搜索和浏览需要标记化的数据。它也很快;但我不认为这是这项工作的正确工具。

您还可以查看此博客文章,了解有关Solr提交的更多信息。 https://lucidworks.com/blog/2013/08/23/understanding-transaction-logs-softcommit-and-commit-in-sorlcloud/

根据帖子:

  

软提交是关于可见性的,硬提交是关于耐久性的。   关于软提交最能理解的是他们会这样做   使文件可见,但需要付出一些代价。特别是“顶级   level“缓存,包括你在solrconfig.xml中配置的内容   (filterCache,queryResultCache等)将失效! Autowarming   将在您的顶级缓存上执行(例如filterCache,   queryResultCache),将执行任何newSearcher查询。也,   FieldValueCache无效,因此facet查询必须等待   直到缓存刷新。这是非常频繁的软提交   通常情况下,您的顶级缓存很少使用,可能会在   有些情况下,被淘汰。但是,“段级缓存”,其中   包括函数查询,排序缓存等是“每段”,所以   软提交时不会失效。

答案 1 :(得分:0)

  1. Redis => 尚未探索此选项

  2. SOLR NRT with Soft Commits => 这有点矫枉过正和效率低下,因为它会更新完整的文档,尽管每次只更新部分文档。处理此问题的更有效方法是将这些动态字段(如计数、查看计数等)保留在 Lucene 索引之外。有两种方法可以解决这个问题。

    A.使用 EFF(外部文件字段)。您在帖子中提到: EFF (external file fields) is not an option, as I read that the data in that file can only be used in function queries and cannot be returned as part of a document. 如果我没猜错的话,您希望在搜索响应中使用这些动态字段的相应值。我们可以通过在 field(exteranl_field_name) 参数中使用 fl 来获得它。

    B.使用 docValues。DocValue fields are now column-oriented fields with a document-to-value mapping built at index time. DocValues 不是 Lucene 索引的一部分。我们可以将这些字段定义为 docValue 并使用部分更新功能来更新这些字段。

DocValue => https://solr.apache.org/guide/8_0/docvalues.html

EFF => https://solr.apache.org/guide/8_0/working-with-external-files-and-processes.html

文档更新 => https://solr.apache.org/guide/6_6/updating-parts-of-documents.html