【问题标题】:Merging Hibernate Search results with relational database query将 Hibernate 搜索结果与关系数据库查询合并
【发布时间】:2011-10-14 13:53:00
【问题描述】:
我有一个复杂的查询,需要对某些字段进行全文搜索,并对其他字段进行基本限制。 Hibernate Search 文档 strongly advises against 将数据库查询限制添加到全文搜索查询中,而不是 recommends 将所有必要的字段放入全文索引中。我遇到的问题是其他字段是不稳定的。值可能每分钟左右发生变化,并且对数据库的这些更新可能发生在 JVM 之外进行搜索,因此本地 Lucene 索引很可能相对于这些字段已经过时。
在这里寻找策略建议。到目前为止,我想出的最好方法是通过首先执行数据库查询(仅获取对象 ID)然后执行全文搜索来手动加入结果。并通过数据库中的一组对象 ID 以某种方式有效地过滤 Lucene 结果。当然,我不知道每个单独的查询会得到多少结果,所以我担心性能和内存。在最坏的情况下,它可能是数万行。
【问题讨论】:
标签:
java
hibernate
lucene
hibernate-search
【解决方案1】:
我对其他想法很感兴趣,因为我们有一个非常相似的场景。
我们最多只需要显示 50 个结果行,每行有几个查找。我们使用索引中的 db pk id 对 lucene 索引运行查询,并从数据库中每行提取查找。它对我们来说仍然很高效。
由于您似乎想要处理多于几行和查找,因此我确实考虑了另一种选择。时间戳任何数据库行更新。这将允许我们在数据库中查询过时的索引,然后迭代地调用相关文档的重新索引。
【解决方案2】:
我有同样的问题,并做一个单独的 Lucene 和条件查询。如果我首先执行条件查询,我将使用生成的 id 来为 Lucene 搜索应用自定义 IdFilter,以检查结果是否在第一个查询的给定 Id 集合中。但是,这种方法不能很好地扩展,因为在我的情况下,第一次查询后的结果数量可能很大,并且过滤器限制为 1024 个 id。我没有找到一个好的解决方案,但我根据预期结果的数量更改了两个查询的顺序。第一个查询应该是过滤掉大部分结果的查询。