solr - 可以使 Apache Solr 索引在事务上与被索引的数据库保持一致吗?

标签 solr transactions lucene cluster-computing consistency

我是 Solr 的新手。我正在尝试制作一个将结构化数据存储在数据库中的服务器,并且可以使用 Solr/Lucene 进行搜索。服务器可以集群成任意数量的相同节点以实现高可用性。

似乎标准配置 Solr 将索引存储在文件系统上的文件中。这似乎在一致性和集群方面引入了一些问题。

如何使索引在事务上与数据库保持一致?有没有办法做到这一点? (例如,通过某种方式向数据库提交与对 Solr 索引的提交协调一致?)

有没有办法将索引存储在(关系)数据库中?这将解决一致性问题和集群问题,但我没有找到很多关于如何做到这一点的文献。

配置为集群时,是否每个集群节点都需要维护自己的索引副本。目前尚不清楚 Solr 的多个实例是否可以更新单个索引。

或者——我们是否放弃接受索引不能保证一致,每天重建它?对此,人们通常会怎么做?

最佳答案

问> 如何使索引在事务上与数据库保持一致?
A> 你不能。您可能可以在顶部发明另一个事务层,但是开发需要很长时间,而且无论如何都不会达到 100% 的一致性。例如,您可以将数据同时发送到 DB 和 Solr,并且仅在两个数据到达后才提交,但这不会是原子的。

问> 有没有办法将索引存储在(关系)数据库中?
A> 使用 Lucene 4.0,您可能可以(通过编写自己的编解码器)。但这并不能解决你的问题。

问> 配置为集群时,是否每个集群节点都需要维护自己的索引副本?
A> 是的。

问> 目前尚不清楚 Solr 的多个实例是否可以更新单个索引。
A> 多个 Lucene/Solr 实例不能写入同一个索引文件。最大你能做的就是创建多个IndexSearcher s。但这可能是在 Solr 级别完成的。

问> 我们是否放弃接受索引不能保证一致?
A> 是的。我认为你太以数据库为中心了。想想 Solr/Lucene,就像你对谷歌的看法一样——我敢打赌,他们不会在世界范围内自动地推出他们的整个索引。如果搜索结果根据您访问的服务器(当然是几秒钟)会有轻微的不一致,这没什么大不了的。

> 每天重建一次?对此,人们通常会怎么做?
A> Lucene 有 near-real time search但在基本级别,您只需发送索引更新并在数据库更改发生时提交,然后重新打开索引阅读器以查看这些更新。这一切都是在 Solr 中自动完成的。

关于solr - 可以使 Apache Solr 索引在事务上与被索引的数据库保持一致吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12966489/

相关文章:

search - 如何在 solr 的多值字段中添加不同的值

solr - 包含多个单词的elasticsearch短语频率.tf()

c# - MySQL插入 double 值时出现问题

ruby-on-rails - Sidekiq 是否适用于高度关键任务、需要一次性执行保证、需要单线程执行的任务?

oracle - "ORA-14450: attempt to access a transactional temp table already in use"在复合触发器中

text - 为什么每种语言都需要一个分词器?

solr - 如何在SOLR中实现归档?

solr - Solr与Elasticsearch进行近实时搜索

search - Solr splitOnCaseChange 在查询时?

lucene - Lucene如何使用引号和通配符