在 Apache SOLR 中保证提交的最佳方法是什么?
What is the best approach to guarantee commits in Apache SOLR?
问题: 我怎样才能 "guarantee commits" 使用 Apache SOLR,其中将数据保存到磁盘和可见性同样重要?
背景: 我们有一个网站需要机器学习的高端搜索功能,还需要有保证的金融交易承诺。我们只想将 SOLR 作为我们唯一的数据存储来保持简单,不想同时使用另一个数据库。
我似乎找不到这个问题的任何答案。金融交易最简单的解决方案似乎是在记录持久化后定期向 SOLR 查询记录,但这可能需要更长的等待时间,或者是否有更好的解决方案?
任何人都可以提出使用 SOLR 实现 "guaranteed commits" 的解决方案吗?
Solr 提供两种类型的提交来将数据保存在 solr 中。
- 软提交: 软提交持久化到 Solr 数据结构中。 Solr 保证每次软提交后文档的可见性。它实际上并不将数据存储到磁盘中。因此,如果 Solr 实例出现故障,则无法恢复此信息。
- Hard Commit:每次应用程序索引数据到solr时,它可以执行数据的硬提交。硬提交将数据持久保存到磁盘中,即使实例出现故障也可以恢复。频繁硬提交的缺点是,solr 必须频繁执行段合并,这是 CPU 密集的。
您可以根据需要在solrconfig.xml中配置autoCommit选项。
<autoCommit>
<maxDocs>10000</maxDocs>
<maxTime>1000</maxTime>
<openSearcher>false</openSearcher>
</autoCommit>
每种方法各有利弊。您可以在 Apache Wiki Commits and an article from LucidWorks on commits in CloudSolr Understanding Transaction Logs, Soft Commit and Commit in SolrCloud
上找到更多信息
答案是 Solr 不是设计为主要数据存储。它的数据结构和 indexing/retrieval 专为其他用例而设计,即使表面上看起来都像 CRUD。您应该将您的数据保存在其他地方,然后在 Solr 中建立索引——以一种便于查找的方式——稍后。与 Elasticsearch 和其他面向搜索的软件相同。
如果您绝对必须结合这些东西,请查看在 Cassandra 或其他类似数据库之上包含 Solr 的商业产品。
如邮件列表中所述,Solr 没有事务。如果您从十几个客户端建立索引,并且某个地方发生了提交(autoSoftCommit、更新请求中的 commitWithin,或者来自这十几个客户端之一的显式提交),all 文档所有搜索者都可以看到被这十几个客户编入索引的内容。
使用事务数据库,发送更新的十几个客户端中的每一个都必须发出提交,这只会使该特定客户端所做的更改可见。
Solr 通常不对提交做出任何保证。如果您并行发出十次提交,那很可能会超过 maxWarmingSearchers 配置,该配置通常设置为 2。这十次提交中的大多数实际上不会创建新的搜索器,这就是使新文档可见的原因。
如果您以永远不会超过 maxWarmingSearchers 的方式进行手动提交,那么当该提交无误地完成时,您可以将其视为所有更改现在可见的标志。
问题: 我怎样才能 "guarantee commits" 使用 Apache SOLR,其中将数据保存到磁盘和可见性同样重要?
背景: 我们有一个网站需要机器学习的高端搜索功能,还需要有保证的金融交易承诺。我们只想将 SOLR 作为我们唯一的数据存储来保持简单,不想同时使用另一个数据库。
我似乎找不到这个问题的任何答案。金融交易最简单的解决方案似乎是在记录持久化后定期向 SOLR 查询记录,但这可能需要更长的等待时间,或者是否有更好的解决方案?
任何人都可以提出使用 SOLR 实现 "guaranteed commits" 的解决方案吗?
Solr 提供两种类型的提交来将数据保存在 solr 中。
- 软提交: 软提交持久化到 Solr 数据结构中。 Solr 保证每次软提交后文档的可见性。它实际上并不将数据存储到磁盘中。因此,如果 Solr 实例出现故障,则无法恢复此信息。
- Hard Commit:每次应用程序索引数据到solr时,它可以执行数据的硬提交。硬提交将数据持久保存到磁盘中,即使实例出现故障也可以恢复。频繁硬提交的缺点是,solr 必须频繁执行段合并,这是 CPU 密集的。
您可以根据需要在solrconfig.xml中配置autoCommit选项。
<autoCommit>
<maxDocs>10000</maxDocs>
<maxTime>1000</maxTime>
<openSearcher>false</openSearcher>
</autoCommit>
每种方法各有利弊。您可以在 Apache Wiki Commits and an article from LucidWorks on commits in CloudSolr Understanding Transaction Logs, Soft Commit and Commit in SolrCloud
上找到更多信息答案是 Solr 不是设计为主要数据存储。它的数据结构和 indexing/retrieval 专为其他用例而设计,即使表面上看起来都像 CRUD。您应该将您的数据保存在其他地方,然后在 Solr 中建立索引——以一种便于查找的方式——稍后。与 Elasticsearch 和其他面向搜索的软件相同。
如果您绝对必须结合这些东西,请查看在 Cassandra 或其他类似数据库之上包含 Solr 的商业产品。
如邮件列表中所述,Solr 没有事务。如果您从十几个客户端建立索引,并且某个地方发生了提交(autoSoftCommit、更新请求中的 commitWithin,或者来自这十几个客户端之一的显式提交),all 文档所有搜索者都可以看到被这十几个客户编入索引的内容。
使用事务数据库,发送更新的十几个客户端中的每一个都必须发出提交,这只会使该特定客户端所做的更改可见。
Solr 通常不对提交做出任何保证。如果您并行发出十次提交,那很可能会超过 maxWarmingSearchers 配置,该配置通常设置为 2。这十次提交中的大多数实际上不会创建新的搜索器,这就是使新文档可见的原因。
如果您以永远不会超过 maxWarmingSearchers 的方式进行手动提交,那么当该提交无误地完成时,您可以将其视为所有更改现在可见的标志。