我们正在使用 Spring MVC、Spring 和 Hibernate 开发一个 Web 应用程序。
我们需要为我们的应用程序添加高效的自由文本搜索功能。为此,我们正在考虑使用 Hibernate Search(它在引擎盖下使用 Lucene)或直接使用 lucene。
由于我们已经在我们的应用程序中使用了休眠,对我们来说最好的选择是什么?一个比另一个有什么优点和缺点?
谢谢。
我们正在使用 Spring MVC、Spring 和 Hibernate 开发一个 Web 应用程序。
我们需要为我们的应用程序添加高效的自由文本搜索功能。为此,我们正在考虑使用 Hibernate Search(它在引擎盖下使用 Lucene)或直接使用 lucene。
由于我们已经在我们的应用程序中使用了休眠,对我们来说最好的选择是什么?一个比另一个有什么优点和缺点?
谢谢。
你自己说过 - 你会以一种或另一种方式使用 Lucene。
原始的 Lucene API 不是很容易使用。它比 Hibernate Search 低级得多。如果您已经在使用 Hibernate,那么这很容易 - 使用 Hibernate Search 来实现您的文本搜索功能。
免责声明:我是 Hibernate Search 的开发人员之一。
该项目的目标不是与 Lucene 或 Solr 竞争,而是尽可能促进与 Hibernate 应用程序的集成,避免必须保持两个世界同步并重复所有映射和 CRUD 操作。
虽然我们提供了一些常用的帮助器和良好的封装,但 Hibernate Search 还可以让您直接引用 Lucene API,因此如果您发现自己需要使用“原始”Lucene API,您将永远不会被卡住。此外,对于写入索引,Hibernate Search 提供了一种通用模式,可以解决大多数已知需求,但如果您有非常非标准的需求,您可以完全控制书面文档。
Solr 是一个不错的选择,但由于它是一个单独的服务器,您必须通过 REST API 与它进行交互,这完全不同,各有利弊。并不总是需要管理第二个服务,当然远程调用永远不会像直接引用 Lucene 及其所有内部过滤器和缓存那样有效。并非 Lucene 的所有功能都可以通过远程 API 公开,如果您需要做一些“低级”操作,如果这没有在 Solr 中实现,您将无法做到(无需修补 Solr)。Solr 仍然非常可爱,尤其是当您想与其他非 Java 应用程序共享索引时,因此我们可能会为 Hibernate Search 添加一个 Solr 后端以最终保持 Solr 服务器同步(特别是如果对它感兴趣,并且可能一些帮助)。
最后,Lucene API 是非常硬核的东西。我们花了很多精力来充分利用它来提供最佳性能,同时向使用 Hibernate Search 的人公开稳定的 API,基本上直到现在所有版本都向后兼容,以提供“插入式”性能提升以使用最新版本来自 Lucene 的最大技巧 - 实际上经常更改 API;这些变化总是令人兴奋的,但如果您不使用适当的抽象,请准备好在您的应用程序中维护这些变化。
使用 Lucene 的另一种方法是获取称为 SOLR 的 middlman API。SOLR 将连接到 Lucene 并执行 HTTP 调用以进行搜索。请注意,您需要构建和解析 Solr 使用的 XML。Lucene 的所有功能都是通过 SOLR 公开的,应该很有帮助。