使用 Hibernate 搜索的高级搜索
Posted
技术标签:
【中文标题】使用 Hibernate 搜索的高级搜索【英文标题】:Advanced Search Using Hibernate Search 【发布时间】:2012-05-07 03:33:26 【问题描述】:在我的一个应用程序中,我要对多个字段/列执行搜索。它是一个高级搜索,用户可以使用 20 多个字段来搜索结果。例如,用户可以根据
-
预订编号
乘客姓名
乘客年龄
从位置
到位置
预订状态
航空公司名称
和 13 个这样的字段。
我想知道是否
Hibernate Search 可以而且应该在这里使用吗?如果是这样,怎么做?我找不到使用 Hibernate Search 进行如此复杂搜索的示例。
代替 Hibernate 搜索,我可以简单地使用 Hibernate,并且可能根据参数的数量设计一个多线程搜索。这是个好主意吗?
这里可以使用休眠过滤器吗?
有人可以提供输入或参考链接吗?
【问题讨论】:
您是否希望用户将他们的搜索条件输入到一个字段中,然后针对多个列进行测试?还是为每列单独的搜索字段? 每列的单独字段。 【参考方案1】:我认为你的决定应该基于对容量的要求。 普通的 Hibernate 查询可能足以在这些字段上进行搜索。
如果您想使用反向索引快速获取大量数据的搜索查询,Hibernate Search 会有所帮助。例如,您应该做的是以未来 5 年的预期容量加载数据库。如果您的普通 Hibernate 查询被认为是可以接受的,我认为您应该坚持使用普通 Hibernate 查询。
您也可以在后期引入 Hibernate Search。
编辑: 您可以选择不使用 Hibernte Search,转而使用 Apache Lucene。您可以生成自己的 Apache Lucene 索引。这样您就不必担心要查找记录的字段,因为您将完全控制标记化和索引过程的方式。 如果选择这种方式,您可以将行名和列名存储为搜索结果的一部分。
【讨论】:
感谢您的回复@Daniel。我关心的是生成查询必须编写的复杂代码量。我从超过 25 个表中搜索,需要手动编写的连接数很容易出错。 担心复杂的代码?下一层到 Apache Lucene。您不必创建 Hibernate 查询,而是查询您自己创建的 Lucene 索引。唯一的缺点是你需要了解底层的 Lucene 技术。【参考方案2】:是的,Hibernate Search 在这种情况下会非常有用。您可以使用过滤器,但 Hibernate Search 也有过滤器。
【讨论】:
【参考方案3】:对于这些类型的查询,我通常使用带有表单对象的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();
【讨论】:
嗨@Aaron,感谢您的回复。我的问题是数据分布在大约 25 个表中。所以说,如果我使用 Criteria,那将是一个带有 Joins 的巨大声明。这是我想要避免有一个干净的实现的事情。如果我说要搜索 5 到 6 个字段,那么您提出的建议非常有效。 如果你有 Hibernate 实体设置了关系,那么 Hibernate 将为你处理所有这些连接,你将能够在其他表上使用上述策略。在 Hibernate 中思考,而不是 SQL,让工具为您完成工作。 我不确定我是否理解正确。让我举个例子,我要搜索“旅行类型”为“单程”的“预订”。旅行类型嵌入在比“预订”类低 6 级的类中。所以我实际上必须搜索旅行类型而不是预订舱位。现在,我可以搜索 20 个这样的参数,这些参数嵌入到 Booking 类的各个级别。如果我必须使用 Criteria 执行此操作,我将不得不加入这些级别的所有表,我认为这非常麻烦。以上是关于使用 Hibernate 搜索的高级搜索的主要内容,如果未能解决你的问题,请参考以下文章