代码之家  ›  专栏  ›  技术社区  ›  Mike Stone

如何用lucene对数据库进行最佳搜索?

  •  7
  • Mike Stone  · 技术社区  · 16 年前

    我正在研究针对我们的数据库的更好的搜索功能的机制。它目前是一个巨大的瓶颈(导致长期查询,损害我们的数据库性能)。

    我老板要我调查一下 Solr ,但仔细观察,我们似乎真的需要lucene本身的某种db集成机制。

    Lucene FAQ ,他们建议 Hibernate Search , Compass DBSight .

    作为当前技术堆栈的背景,我们在tomcat上使用的是直接的jsp,没有hibernate,没有其他框架在上面……直接将Java、JSP和JDBC与DB2数据库进行比较。

    考虑到这一点,Hibernate搜索可能更难集成到我们的系统中,尽管在这样的集成之后可以选择使用Hibernate可能会更好。

    有没有人可以分享使用这些工具(或其他类似的基于lucene的解决方案)的经验,这些工具可能有助于选择正确的工具?

    它需要是一个自由和开放源码软件解决方案,理想情况下,它将自动(虽然有效)利用数据库中的更改来管理更新lucene,而无需在更改完成时通知工具(否则,滚动我自己的lucene解决方案似乎也一样好)。此外,我们有多个应用程序服务器,只有一个数据库(+故障转移),因此,如果能够从所有应用程序服务器无缝地使用该解决方案,那就太好了。

    我正在继续检查这些选项,但是利用别人的经验会很有帮助。

    5 回复  |  直到 12 年前
        1
  •  3
  •   erickson    16 年前

    你说“搜索数据库”是什么意思?

    关系数据库和信息检索系统使用非常不同的方法是有充分理由的。你在搜索什么样的数据?您执行哪种查询?

    如果我要像compass那样在数据库上实现反向索引,我就不会使用他们的方法,也就是实现lucene的 Directory 带斑点的抽象。相反,我会实现lucene的 IndexReader 抽象化。

    关系数据库能够很好地维护索引。lucene在这个上下文中带来的价值是它的分析功能,这些功能对于非结构化文本记录非常有用。一个好的方法可以利用每个工具的优势。

    当对索引进行更新时,lucene会创建更多的段(附加文件或blob),这会降低性能,直到使用代价高昂的“优化”过程。大多数数据库将在每次索引更新时分摊此成本,从而提供更稳定的性能。

        2
  •  2
  •   Mark Smithson    16 年前

    我对指南针有很好的经验。它与hibernate有很好的集成,可以通过gps设备将hibernate和jdbc所做的数据更改直接映射到lucene索引。 http://www.compass-project.org/docs/1.2.2/reference/html/gps-jdbc.html .

    在所有应用服务器上维护lucene索引可能是一个问题。如果您有多个应用服务器更新数据库,那么您可能会遇到一些问题,使索引与所有更改保持同步。罗盘现在可能有一个替代的机制来处理这个问题。

    alfresco项目(cms)也使用lucene,并且有一种在服务器之间复制lucene索引更改的机制,这可能有助于处理这些问题。

    我们在Hibernate Search还没有真正面世之前就开始使用Compass,所以我无法与之进行任何比较。

        3
  •  1
  •   Glen    14 年前

    卢瑟尔 http://code.google.com/p/lusql/ 允许您将JDBC可访问数据库的内容加载到Lucene中,使其可搜索。它是高度优化和多线程的。我是lusql的作者,下个月将推出一个新版本(用一个新的可插入架构重新构建)。

        4
  •  0
  •   scunliffe    16 年前

    搜索lucene的纯性能提升肯定会有很大帮助。只列出你关心/需要的东西,你应该做得很好。如果你愿意的话,你可以用hibernate或者其他一些工具,但我认为这不是必需的。

        5
  •  0
  •   Mike Stone    16 年前

    嗯,看起来星光 doesn't meet the FOSS requirement ,所以除非它是一个绝对的恒星解决方案,否则现在对我来说不是一个选择…