将Hibernate搜索结果与关系数据库查询合并

时间:2011-10-14 13:53:00

标签: java hibernate lucene hibernate-search

我有一个复杂的查询,需要对某些字段进行全文搜索,并对其他字段进行基本限制。 Hibernate Search文档strongly advises against将数据库查询限制添加到全文搜索查询,而recommends将所有必要字段添加到全文索引中。我遇到的问题是其他字段是不稳定的;值可以每分钟左右更改一次,对数据库的更新可能发生在执行搜索的JVM之外,因此本地Lucene索引很可能与这些字段相关。

在此处寻找策略建议。到目前为止,我提出的最好的方法是首先执行数据库查询(仅获取对象ID)手动加入结果,然后执行全文搜索。并以某种方式通过数据库中的一组对象ID有效地过滤Lucene结果。当然,我不知道从每个单独的查询中得到多少结果,所以我担心性能和内存。在最坏的情况下,每个行可能会有数万行。

3 个答案:

答案 0 :(得分:0)

我对其他想法非常感兴趣,因为我们有一个非常相似的场景。

我们只需要显示50个结果行作为最大值,每行有几个查找。我们使用索引中的db pk id对lucene索引运行查询,并从每行的数据库中提取查找。它仍然适合我们。

由于您似乎想要处理多行和查找,我确实考虑了另一种选择。时间戳任何数据库行更新。这将允许我们向DB查询陈旧索引,然后迭代地调用相关文档的重新索引。

答案 1 :(得分:0)

我有同样的问题,并进行单独的Lucene和条件查询。如果我第一次执行条件查询,我将使用生成的ID为Lucene搜索应用自定义IdFilter,该搜索检查结果是否在第一个查询的给定Id集合中。然而,这种方法不能很好地扩展,因为在我的情况下,第一次查询后的结果数量可能很大,并且过滤器限制为1024个ID。我没有找到一个好的解决方案,但我根据预期结果的数量更改了我的两个查询的顺序。第一个查询应该是过滤掉大部分结果的查询。

答案 2 :(得分:0)

您可以根据上次修改日期执行调度程序索引更新。