Hibernate Search是一个库,通过自动索引实体,将Hibernate ORM与Apache Lucene或Elasticsearch集成,从而实现高级搜索功能:全文搜索、地理空间搜索、聚合等。更多信息,请参阅hibernate.org上的Hibernate Search。

嗨,

我认为Hibernate Search 3.1.0.Beta2的发布是一个宣布Hibernate Search另一个聚类可能性——Terracotta聚类的良好时机。为什么选择Terracotta?嗯,Terracotta聚类相对于Hibernate Search当前使用的默认JMS聚类有几个潜在的优势?

  • 索引的更新立即对所有集群节点可见
  • 没有共享文件系统的要求
  • 使用更快的RAMDirectory而不是较慢的FSDirectory

但让我们开始吧。您可以在此下载以下示例的代码,或者您可以下载二进制包。目前,代码尚未包含在Search代码库中,但可能在未来某个时候会包含。

首先,您需要下载并安装Terracotta。我使用的是2.6.2版本。只需将版本解压到任意目录。我使用的是/opt/java/terracotta。接下来,您需要主要Compass jar。您可以使用这个jar。将这个jar放入您的Terracotta安装目录的modules目录。这个解决方案实际上并不依赖于任何Compass类,而是利用了一个自定义的RAMDirectoy实现 - org.compass.needle.terracotta.TerracottaDirectory。这是因为Lucene的RAMDirectory默认情况下不支持Terracotta集群。现在让我们启动Terracotta服务器。切换到您的Terracotta安装目录的bin目录并运行./start-tc-server.sh。检查日志以查看服务器是否已正确启动。

接下来,下载并解压hsearch-demo-1.0.0-SNAPSHOT-dist.tar.gz。目前,dist包假定您已有一个运行中的mysql数据库,数据库名为hibernate,用户名和密码为hibernate/hibernate。如果您从源代码构建dist包,可以更改这些设置并使用不同的数据库,但稍后再谈。此外,dist假定您已将Terracotta安装到/opt/java/terracotta。如果不是这种情况,您可以在config/tc-config.xml中更改repository节点。只要您有一个正在运行的mysql数据库且tc-config.xml正确反映了您的Terracotta安装目录,只需键入./run.sh即可。脚本将询问您是否要启动一个独立的应用程序或一个Terracotta集群应用程序。只需按't'键即可启动Terracotta集群应用程序。您应该会看到一个Swing JTable。

按下索引按钮以创建初始索引。数据模型基于前一个Seam示例DVD商店应用程序。索引创建后,只需搜索示例中的Tom即可。您应该在表中看到DVD列表。尝试使用应用程序和不同的查询进行一些实验。准备好后,再次运行./run.sh以启动应用程序的第二个实例。您无需再次创建索引。在第二个实例中,DVD应该可以立即搜索。您还可以在一个应用程序中编辑DVD的标题字段,然后在另一个应用程序中搜索更新后的标题。还可以尝试关闭两个应用程序并重新启动一个新的实例。DVD应该可以立即搜索。Terracotta服务器保留集群Lucene目录的持久副本。

现在,是时候从源代码构建应用程序了。这将允许您实际检查代码并更改诸如数据库设置之类的设置。下载hsearch-demo-1.0.0-SNAPSHOT-project.tar.gz并将其解压。在您首选的IDE中导入maven项目。要构建项目,您需要在您的settings.xml中定义以下存储库

        <repository>
          <id>jboss</id>
          <url>http://repository.jboss.com/maven2</url>
        </repository>
        <repository>
          <id>compass-project.org</id>
          <url>http://repo.compass-project.org</url>
        </repository>

如果您想使用不同的数据库,您可以在pom.xml中添加/修改配置文件部分。还要查看src/main/scripts/tc-config.xml并调整任何与您的设置不同的设置。一旦您对一切满意,只需运行mvn assembly:assembly即可构建您自己的应用程序版本。

我基本上只是开始尝试这种形式的集群,还有一些悬而未决的问题

  • 与JMS集群相比,它的性能如何?
  • RAMDirectory的大小限制是多少?
  • 我如何添加故障转移功能?

我计划不久后进行一些更广泛的性能测试。如果您感兴趣,请保持关注。

—Hardy

附言:如果有人实际尝试一下并告诉我是否成功,那就太好了。正如所说,这仍然是一个正在进行中的项目。欢迎任何反馈 :)


回到顶部