11

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

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

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

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

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

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

4

2 回答 2

18

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

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

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

Q>不清楚 Solr 的多个实例是否可以更新单个索引。
A>多个 Lucene/Solr 实例不能写入同一个索引文件。最多可以创建多个IndexSearchers. 但无论如何,这可能是在 Solr 级别完成的。

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

Q > 每天都重建吗?人们通常会怎么做呢?
A> Lucene 具有近乎实时的搜索,但在基本级别上,您只需发送索引更新并在数据库更改发生时提交,然后重新打开索引阅读器以查看这些更新。这一切都是在 Solr 中自动完成的。

于 2012-10-19T09:51:29.313 回答
1

知道这有点旧,但它可能会对某人有所帮助。您可以使用 Apache zookeeper 尝试 solrcloud。

开箱即用的 Apache Solr 包括设置 Solr 服务器集群的能力,该集群结合了容错和高可用性 - 称为 SolrCloud,这些功能提供分布式索引和搜索功能,只需少量配置即可支持以下功能:

Central configuration for the entire cluster
Automatic load balancing and fail-over for queries
ZooKeeper integration for cluster coordination and configuration.

Zookeeper 是 solr 的集群管理器。它与 solr 配合得非常好。

https://cwiki.apache.org/confluence/display/solr/SolrCloud

http://zookeeper.apache.org/doc/trunk/zookeeperOver.html
于 2014-11-24T12:04:56.053 回答