我是Solr的新手。我正在尝试创建一个将结构化数据存储在数据库中的服务器,并且可以使用Solr / Lucene进行搜索。服务器可以集群到任意数量的相同节点中以实现高可用性。
似乎标准配置Solr将索引存储在文件系统上的文件中。这似乎在一致性和聚类方面引入了一些问题。
如何使索引在事务上与数据库保持一致?有没有办法做到这一点? (例如,通过提交Solr索引协调提交到DB的某种方式?)
有没有办法将索引存储在(关系)数据库中?这将解决一致性问题和集群问题,但我没有找到很多关于如何做到这一点的文献。
当配置为群集时,每个群集节点是否需要维护它自己的索引副本。目前尚不清楚Solr的多个实例是否可以更新单个索引。
或者 - 我们是否放弃接受索引不能保证一致,每天都重建它?人们通常会对此做些什么?
答案 0 :(得分:17)
Q> 如何使索引在事务上与数据库保持一致?
A> 你不能。您可以在顶部创建另一个事务层,但开发需要很长时间,无论如何您都不会达到100%的一致性。例如,您可以将数据发送到DB和Solr,并且只在两个数据到达后才提交,但这不是原子的。
Q> 有没有办法将索引存储在(关系)数据库中?
A> 使用Lucene 4.0,您可能(通过编写自己的编解码器)。但这不会解决你的问题。
Q> 当配置为群集时,每个群集节点是否需要维护自己的索引副本?
A> 是。
Q> 目前尚不清楚Solr的多个实例是否可以更新单个索引。
A> 多个Lucene / Solr实例无法写入相同的索引文件。你可以做的最多就是创建多个IndexSearcher
。但无论如何,这可能是在Solr级别完成的。
Q> 我们是否放弃接受索引不能保证一致?
A> 是的。我认为你太以数据库为中心了。想想Solr / Lucene,你会想到谷歌 - 我敢打赌他们不会在全世界原子地推出他们的整个指数。如果搜索结果会有轻微的不一致性,具体取决于您点击的服务器(当然只有几秒钟),这不是什么大问题。
问强>>每天重建它?人们通常对此做些什么?
A> Lucene有near-real time search但在基本级别您只需发送索引更新并在db更改发生时提交,然后重新打开索引阅读器以查看这些更新。这一切都在Solr中自动完成。
答案 1 :(得分: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