使用Hibernate Search进行高级搜索

时间:2012-04-26 11:48:51

标签: hibernate hibernate-search advanced-search

在我的一个应用程序中,我将对多个字段/列执行搜索。它是一个高级搜索,有超过20个字段,用户可以使用这些字段搜索结果。例如,用户可以根据

搜索预订
  1. 预订ID
  2. 乘客姓名
  3. 乘客年龄
  4. 从位置
  5. 到位置
  6. 预订状态
  7. 航空公司名称
  8. 和13个这样的领域。

    我想知道是否

    1. Hibernate Search可以而且应该在这里使用吗?如果是这样,怎么样?我无法使用Hibernate Search找到这种复杂搜索的示例。

    2. 我可以简单地使用Hibernate代替Hibernate搜索,也可以根据参数的数量设计多线程搜索。这是个好主意吗?

    3. 可以在这里使用Hibernate过滤器吗?

    4. 有人可以提供输入或参考链接吗?

3 个答案:

答案 0 :(得分:2)

对于这些类型的查询,我通常使用带有表单对象的Criteria查询。然后,我在每个传递的表单字段中检查null,如果不是null,则使用该字段在查询中添加另一个Restriction。使用Criteria查询可以使Java代码非常干净,并消除混乱的字符串连接。您案例的一个例子:

// Form object
public class bookingSearchForm {
    private String bookingId;
    public getBookingId()...
    public setBookingId()...
}

// Hibernate
Criteria criteria = getSession().createCriteria(Booking.class);
if(form.getBookingId() != null) {
    criteria.add(Restrictions.eq("bookingId", form.getBookingId()));
}
criteria.list();

答案 1 :(得分:2)

我认为您的决定应该基于容量要求。 普通的Hibernate查询可能足以搜索那么多字段。

如果您希望使用反向索引快速获取大量数据的搜索查询,Hibernate Search将会有所帮助。您应该做的是以您在未来5年内所期望的容量加载数据库。如果您的普通Hibernate查询被认为是可接受的,我认为您应该坚持使用普通的Hibernate查询。

您也可以在后期介绍Hibernate Search。

编辑: 您可以选择不使用Hibernte Search,转到较低级别并使用Apache Lucene。您可以生成自己的Apache Lucene索引。这样您就不必担心哪个字段可以查找记录,因为您可以完全控制标记化和索引编制过程。 如果选择这种方式,可以将行和列名称存储为搜索结果的一部分。

答案 2 :(得分:0)

是的,在这种情况下,Hibernate Search会非常有用。您可以使用过滤器,但Hibernate Search也有过滤器。