2009-12-02 103 views
1

我正在使用Hibernate Search并在一个表上为一个域对象应用Lucene索引。我现在想从这张表中为域对象做出选择,并且基于与未被索引的其他表进行连接来应用过滤。Hibernate搜索问题

对于试卷,我有Auction Lots表格,我已经编入索引。我有行情表。报价具有对拍卖地的参考。

我想在AuctionLots表中进行完整的测试搜索并返回没有引号的匹配实体。在普通的SQL中,这可以通过JOIN来实现。

但是在使用HibernateSearch的情况下,为了获取域对象,我必须进行全面的测试搜索,但是我不知道如何使用JOIN执行过滤。

有没有任何机构有一个想法如何做到这一点?

回答

2

我不建议在为搜索创建索引时进行过滤。主要是因为它不被Hibernate Search支持,据我所知,但也因为它没有任何意义。在我看来,你应该做的是为你想要搜索的对象编制索引,包括与'孩子'对象的关系。 我假设你的ActionLot对象与你的Quotes对象有一对多的关系。通过@IndexEmbedded注释,您可以将您的报价标记为也应该被索引的对象。 当您搜索不带引号的ActionLots时,可以在搜索过程中使用搜索查询中的限制条件或将全局过滤器应用于搜索过滤此过滤条件。这可以使用Hibernate Search提供的filter options完成。

+0

一个ActionLot实例的索引进行更新,谢谢!但是你不觉得,像引号这样频繁变化的数据索引有点不对吗? – glaz666 2009-12-02 12:18:38

+0

我不知道它变化的频率如何,但我不认为这会是一个大问题。 Lucene(由Hibernate Search使用)有一个相当不错的索引器,它对速度进行了优化,并在必要时推迟索引。为了使索引更小,您可以使用[ClassBridge](http://docs.jboss.org/hibernate/stable/search/reference/en/html_single/#d0e2466)将引号的字段合并到一个Lucene字段中。 – 2009-12-02 16:31:14

1

使用@IndexEmbedded或ClassBridge绝对是正确的方法。改变数据也不应该导致问题。这就是自动索引的用处。每次报价更改时,您不必重新索引所有数据。依靠自动索引将确保只有添加/更新的数据才会被重新索引。 作为一个说明 - 如果你想,当相关的报价变化,你需要有一个双向关系,并使用@ConstainedIn

--Hardy