7

在我的一个应用程序中,我要对多个字段/列执行搜索。它是一个高级搜索,用户可以使用 20 多个字段来搜索结果。例如,用户可以根据以下内容搜索预订

  1. 预订编号
  2. 乘客姓名
  3. 乘客年龄
  4. 从位置
  5. 到位置
  6. 预订状态
  7. 航空公司名称

和13个这样的领域。

我想弄清楚是否

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

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

  3. 是否可以在这里使用休眠过滤器?

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

4

3 回答 3

2

我认为你的决定应该基于对容量的要求。普通的 Hibernate 查询可能足以在这些字段上进行搜索。

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

您也可以在后期引入 Hibernate Search。

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

于 2012-05-24T08:21:56.740 回答
2

For these kinds of queries, I generally use a Criteria query with a form object. I then check for null in each passed form field, and if not null, then add another Restriction into the query, using that field. Using a Criteria query keeps the Java code very clean and eliminates messy string concatenation. An example for your case:

// 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();
于 2012-04-26T18:37:30.617 回答
0

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

于 2012-05-02T17:24:05.953 回答