我正在研究针对我们的数据库提供更好搜索功能的机制。它目前是一个巨大的瓶颈(导致持久的查询正在损害我们的数据库性能)。
我的老板希望我研究 Solr ,但仔细观察后,我们似乎实际上需要某种与 Lucene 本身的数据库集成机制。
从 Lucene FAQ 中,他们推荐 Hibernate Search 、 Compass 和 DBSight 。
作为我们当前技术堆栈的背景,我们在 Tomcat 上使用直接的 JSP,没有 Hibernate,在它之上没有其他框架......只是针对 DB2 数据库的直接 Java、JSP 和 JDBC。
鉴于此,Hibernate Search 似乎更难以集成到我们的系统中,尽管在这样的集成之后可以选择使用 Hibernate 可能会很好。
是否有人可以分享使用其中一种工具(或其他类似的基于 Lucene 的解决方案)的经验,这些经验可能有助于选择合适的工具?
它需要是一个 FOSS 解决方案,并且理想情况下将自动(尽管高效)使用数据库中的更改来管理更新 Lucene,而无需额外努力在进行更改时通知该工具(否则,它似乎在滚动我自己的 Lucene 解决方案会一样好)。此外,我们有多个应用程序服务器,只有 1 个数据库(+故障转移),所以如果能够轻松地无缝地使用来自所有应用程序服务器的解决方案,那就太好了。
我现在正在继续检查这些选项,但利用其他人的经验真的很有帮助。
最佳答案
当你说“搜索数据库”时,你是什么意思?
关系数据库和信息检索系统使用非常不同的方法是有充分理由的。你在搜索什么样的数据?您执行哪种查询?
如果我要像 Compass 那样在数据库上实现倒排索引,我不会使用他们的方法,即使用 BLOB 实现 Lucene 的 Directory
抽象。相反,我会实现 Lucene 的 IndexReader
抽象。
关系数据库非常有能力维护索引。 Lucene 在这方面带来的值(value)是它的分析能力,这对非结构化文本记录最有用。一个好的方法是利用每个工具的优势。
随着对索引进行更新,Lucene 会创建更多段(附加文件或 BLOB),这会降低性能,直到使用代价高昂的“优化”过程。大多数数据库会在每次索引更新时分摊此成本,从而为您提供更稳定的性能。
关于database - 如何使用 Lucene 最好地搜索数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/86378/