我们正在为企业Web应用程序设计搜索体系结构。我们将为此使用Lucene.net。索引不会很大(大约100,000个文档),但搜索服务必须始终保持最新状态。将一直有新的文件添加到索引和并发搜索。 由于我们必须为搜索系统提供高可用性,因此我们有两台应用程序服务器公开WCF服务以执行搜索和索引(服务的副本在每个服务器中运行)。服务器然后使用lucene.net API访问索引。跨多个应用程序服务器同步Lucene.net索引
问题是,保持索引始终同步的最佳解决方案是什么?我们已经考虑了几种选择:
使用索引和一个服务器 具有第二服务器访问通过SMB的 指标:没有做不到的,因为我们有 失败 情况的单点;
为两台服务器建立索引,实质上每次编写索引两次:可能性很差,并且可能会出现异步。服务器1索引正常,服务器2耗尽磁盘空间或任何东西;
使用SOLR或KATTA来包装对索引的访问:nope,我们不能在服务器上运行tomcat或类似服务器,我们只有IIS。我发现这可以通过Lucene(JdbcDirectory模块)的Java版本来完成,但是我找不到Lucene.net的任何类似的东西。即使这意味着小的性能下降,我们也会选择这个选项,因为它可以彻底解决并发问题,并与mininum开发同步。
使用Lucene.net DistributedSearch contrib模块:我无法用文档记录关于此的单个链接。我甚至不知道通过查看代码的代码是什么,但在我看来,它实际上将索引拆分到多台机器上,这不是我们想要的。如果索引变大,可能需要一段时间,并且在这段时间内,我们将会成为rsync和朋友,在两台服务器之间来回拷贝索引:返回腐败或不一致的数据给客户,所以我们不得不制定一些我们不想要的特别锁定策略。
我知道这是一个复杂的问题,但我相信很多人都面对过它。欢迎任何帮助!
肖恩,这是目前我们的候选人选项。我同意你和它的看法,这似乎是最为抉择的选择。我还试图找到JdbcDirectory的源代码,以查看.NET + SQL服务器的端口是否可行。 将问题保持开放一段时间,看看是否有新的方法出现,否则将接受此答案。 – 2009-06-03 12:44:45
我查了一次同样的事情。这似乎不值得付出努力,因为存在一堆与DB事务相关的东西,这些东西并不是微不足道的。也有使用JDBCDirectory的东西降低速度的抱怨。源文件在Compass项目中 - http://svn.compass-project.org/svn/compass/trunk/src/main/src/org/apache/lucene/store/jdbc/ – 2009-06-03 22:39:04