在Apache SOLR中保证提交的最佳方法是什么?

时间:2015-08-21 11:12:08

标签: solr solr4 solrcloud

问题:我如何获得"保证提交"使用Apache SOLR,将数据保存到磁盘和可见性同样重要吗?

背景:我们的网站需要高端搜索功能才能进行机器学习,并且还要求保证提交金融交易。我们只想将SOLR作为我们唯一的数据存储区来保持简单,想要使用另一个数据库。

我似乎无法找到这个问题的任何答案。金融交易的最简单的解决方案似乎是在持久化之后定期查询SOLR以获取记录,但这可能有更长的等待时间或是否有更好的解决方案?

任何人都可以建议一个实现"保证提交的解决方案"与SOLR?

3 个答案:

答案 0 :(得分:4)

正如您在邮件列表中被告知的那样,Solr没有交易。如果您从十几个客户端编制索引,并且某个地方发生了提交(autoSoftCommit,对udpate请求的commitWithin,或者来自其中一个客户端的显式提交),那些所有文档的索引所有搜索者都可以看到十几个客户。

使用事务数据库,发送更新的十几个客户端中的每一个都必须发出提交,这只会使该特定客户端所做的更改可见。

Solr通常不会对提交做出任何保证。如果您并行发出10个提交,那么很可能会超过maxWarmingSearchers配置,通常设置为2.这10个提交中的大多数实际上都不会创建新的搜索器,这使得新文档可见。

如果您以永远不会超过maxWarmingSearchers的方式进行手动提交,那么当该提交完成且没有错误时,您可以将其视为所有更改现在都可见的标志。

答案 1 :(得分:3)

答案是Solr 设计为主数据存储。它的数据结构和索引/检索设计用于其他用例,即使它们表面上看起来都像CRUD。您应该将数据保存在其他位置,然后在Solr中编入索引 - 以便于以后查找的方式。与Elasticsearch和其他面向搜索的软件相同。

如果您必须将这些内容结合起来,请查看在Cassandra或其他类似数据库之上包含Solr的商业产品。

答案 2 :(得分:1)

Solr提供两种类型的提交来保存solr中的数据。

  • 软提交:软提交持续存在于Solr数据结构中。每次软提交后,Solr都会保证文档的可见性。它实际上并不将数据存储到磁盘中。因此,如果Solr实例发生故障,则无法恢复此信息。
  • 硬提交:每次应用程序将数据索引到solr时,它都可以执行数据的硬提交。硬提交会将数据保留在磁盘中,即使实例发生故障也可以恢复。频繁硬提交的缺点是,solr必须频繁执行段合并,这是CPU密集型的。

您可以根据需要在solrconfig.xml中配置autoCommit选项。

<autoCommit>
  <maxDocs>10000</maxDocs>
  <maxTime>1000</maxTime>
  <openSearcher>false</openSearcher>
</autoCommit>

每种方法都有优点和缺点。你可以在Apache Wiki Commits找到更多关于Understanding Transaction Logs, Soft Commit and Commit in SolrCloud的信息,以及关于CloudSolr norm提交的LucidWorks的文章