2015-09-28 112 views
0

我们计划在Web应用程序中使用MySQL作为RDBMS。但也可以将数据发送到Solr以支持更快的搜索。我正在寻求建议采用哪种方法,以及为什么:Solr DIH delta import

  1. 设置定期更新(比如说每30分钟一次)的cron作业 - 大多数教程似乎都暗示了这一点。
  2. http post期间,向mySQL和Solr发送数据。

该应用程序将有用户发布的评论和不同的范围属性需要全文搜索和方面。

编辑:对于那些谁找到自己的方式到这个话题,Solr的wiki有在https://wiki.apache.org/solr/SolrPerformanceFactors

+0

如果您可以提供更多关于应用程序和数据的信息,它会更容易回答。 – YoungHobbit

回答

1

一个简短的写了这条如果您要为用户提供near-real时间数据,那么你应该用第二种方法去。它将更新索引索引中的数据,并使make可供用户搜索。

如果您不需要近实时搜索用户,那么您应该采用第一种方法,即每隔30分钟更新一次索引。

但请记住,这些可能需要在solr设置中进行一些不同的配置。

+0

总是使用方法#2有任何缺点。为什么甚至考虑方法#1。 –

+0

@ beginner101取决于系统的配置是什么w.r.t你索引了多少数据。你还计划solrCloud模式还是独立模式? – YoungHobbit

1

由于younghobbit建议对应用程序数据类型有更多的了解,所以这更容易回答。

即使如此,我会布置一些已知的点,然后您可能会做出稍微更明智的选择。

  1. SOLR索引不像交易处理数据库。它旨在提高原始文本内容搜索的效率,并在内部为搜索的速度提供一些好帮助(我不是SOLR内部专家..所以SOLR专家请随时详细介绍'好的stuf')。为搜索索引数据的过程并不是很便宜,因此最好让SOLR每X分钟执行一次索引魔术,而不是每次都进行索引。毕竟,您希望它使用大部分可用资源为搜索提供最相关的结果。
  2. 您可以根据需要随时向SOLR发送数据,但只有在提交后才真正可用。您可以在每次操作后提交或让SOLR每x分钟执行一次自动提交。 (我不记得确切的配置,但我认为它是15分钟左右)。一个提交是真正触发资源饥饿索引过程的事情,所以做太多的提交并不好。另一方面,承诺太少会导致过时指数。
  3. 既然你有一个MySQL数据库,我猜是有更新的记录。从4.x SOLR内部SOLR并没有实际更新文件。 SOLR处理更新的方式是它将旧文档标记为已删除,并简单地创建一个新文档。这意味着每次更新都会导致SOLR在磁盘上增加更多空间。您偶尔可以调用“优化”操作,SOLR将删除“已删除”文档。当服务器不太忙时,Optimize再次耗尽资源并做得最好。优化还会导致SOLR在优化期间耗尽更多的磁盘空间(规则缩略图=索引大小* 2)。 想象一下,如果您在30分钟内获得了10次更新的MySQL记录,那么如果您在每个http文章上向SOLR发送数据,那么这将导致SOLR中的9个已删除文档和一个活动文档。而在cron工作30分钟的情况下,这意味着要发布1条或最多2条记录。
  4. SOLR不完全是事务性的。它有提交和回滚操作,但它们处理自上次提交后添加的所有文档。 (建议阅读SOLR文档)。这与通常提交的http帖子不同,MySQL db的回滚将位于相同http请求的范围内。比如你在每个http post上发送数据给SOLR,让我们说你遇到需要回滚的场景,MySQL会做一个干净的回滚,但是SOLR回滚并不可行,因为它可能会回滚当前http post发出的其他更改正在处理中。

就我个人而言,我认为方法1更好,但您可能想要调整cron的频率以获得接近实时的搜索响应。真正的实时只能通过方法2来实现,但您必须考虑如何处理与SOLR有关的更新和事务。在选择任何选项之前,请充分理解提交,回滚,优化SOLR中的操作。