我正在研究针对我们的数据库提供更好搜索功能的机制。它目前是一个巨大的瓶颈(导致长期查询损害了我们的数据库性能)。
我的老板希望我查看Solr,但仔细观察后,我们似乎真的想要与Lucene本身建立某种数据库集成机制。
从Lucene FAQ,他们建议Hibernate Search,Compass和 DBSight 。
作为我们当前技术堆栈的背景,我们在Tomcat上使用直接JSP,没有Hibernate,在其上没有其他框架......只针对DB2数据库直接使用Java,JSP和JDBC。
鉴于此,似乎Hibernate Search可能更难以集成到我们的系统中,尽管在这样的集成之后可以选择使用Hibernate。
是否有人可以使用其中一种工具(或其他类似的基于Lucene的解决方案)分享可能有助于选择正确工具的任何经验?
它需要是一个FOSS解决方案,理想情况下会自动(尽管有效)管理更新来自数据库的Lucene,而无需额外的努力在更改时通知工具(否则,它似乎滚动我自己的Lucene解决方案会一样好。此外,我们有多个应用程序服务器只有一个数据库(+故障转移),所以如果能够轻松地无缝地使用所有应用程序服务器的解决方案,那就太好了。
我现在继续检查选项,但利用其他人的经验会非常有帮助。
答案 0 :(得分:3)
当你说“搜索数据库”时,你的意思是什么?
关系数据库和信息检索系统使用截然不同的方法是有充分理由的。你在搜索什么样的数据?您执行了哪些类型的查询?
如果我要在数据库之上实现倒排索引,就像Compass那样,我就不会使用他们的方法,即用BLOB实现Lucene的Directory
抽象。相反,我将实现Lucene的IndexReader
抽象。
关系数据库非常能够维护索引。 Lucene在此上下文中带来的价值是其分析功能,这对非结构化文本记录最有用。一种好的方法可以利用每种工具的优势。
当对索引进行更新时,Lucene会创建更多段(附加文件或BLOB),这会降低性能,直到使用昂贵的“优化”过程。大多数数据库将在每次索引更新时摊销此成本,从而为您提供更稳定的性能。
答案 1 :(得分:2)
我在指南针方面有过很好的经历。它与hibernate的集成非常好,可以将通过hibernate和jdbc进行的数据更改直接映射到Lucene索引,通过它的GPS设备http://www.compass-project.org/docs/1.2.2/reference/html/gps-jdbc.html。
在所有应用程序服务器上维护Lucene索引可能是个问题。如果您有多个App服务器更新数据库,那么您可能会遇到一些问题,使索引与所有更改保持同步。指南针现在可能有另一种机制来处理它。
Alfresco项目(CMS)也使用Lucene,并且具有在服务器之间复制Lucene索引更改的机制,这可能对处理这些问题很有用。
我们在Hibernate Search真正开始之前就开始使用Compass了,所以我无法与它进行任何比较。
答案 2 :(得分:1)
LuSql http://code.google.com/p/lusql/允许您将可访问JDBC的数据库的内容加载到Lucene中,使其可搜索。它经过高度优化和多线程。我是LuSql的作者,并将在下个月推出一个新版本(使用新的可插入架构重新构建)。
答案 3 :(得分:0)
为了获得纯粹的性能提升,搜索Lucene肯定会有很多帮助。只索引你关心/需要的东西,你应该做得很好。如果你愿意,你可以使用Hibernate或其他一些,但我不认为这是必需的。
答案 4 :(得分:0)
好吧,看来DBSight doesn't meet the FOSS requirement,所以除非它是一个绝对出色的解决方案,否则它现在不适合我......