使用条件投影查询进行hibernate-search

时间:2015-03-26 02:23:10

标签: hibernate hibernate-search

我正在使用hibernate搜索我的所有自由文本/方面搜索。我试图提高性能,并且我注意到我的查询有很多不需要的选择和连接。我的目标是创建一个投影查询,现在我知道我可以通过在索引中存储项目来直接使用hibernate-search来完成这项工作,但我想尝试避免对内存消耗这样做。我的想法是从hibernate-search返回一个pks列表,然后将它们传递给我的条件查询。我的问题,这是正确的做法吗?

1 个答案:

答案 0 :(得分:1)

在回答你的问题之前,让我试着澄清一些事情,即使我认为你已经理解了它们。

Hibernate Search是使用Apache Lucene的Hibernate ORM的扩展。根据其配置,它将在Lucene索引中索引部分托管实体。然后,您可以构建一个所谓的“自由文本搜索”查询,该查询搜索Lucene索引。这独立于任何JPA或Hibernate ORM特定查询功能,该功能以存储实体的关系数据库为目标。

返回“自由文本”搜索。 Hibernate Search的默认行为确实是针对Lucene索引运行指定的Lucene查询以检索实体ID列表。然后使用这些ID使用Hibernate ORM功能从数据库进行批量加载。

现在回答你的问题。

  

我正在努力提高性能,而且我注意到我的查询有很多   不需要的选择和连接。

这里必须要区分。发生了两个查询。 Lucene查询自由文本索引和Hibernate ORM查询以引导数据库中的匹配实体。既然你在谈论选择和加入,我认为你谈论后者。如果SQL查询是性能瓶颈并且连接数太多等,那么性能调优应该考虑域模型的复杂性及其与Hibernate ORM(懒惰关联等)相关的调优。

  

我的目标是创建一个投影查询,现在我知道我可以做到这一点   通过在索引中存储项目直接使用hibernate-search

是的,如果您不需要托管实体并且只对部分数据感兴趣,那么投影查询就是您的选择。同样,有两种类型。 Hibernate Search投影查询和Hibernate ORM投影查询。如前所述,前者在Lucene索引中存储其他数据,并对此数据执行投影。在这种情况下,好处是根本没有数据库访问。后一种投影类型是针对关系数据库的投影。而不是加载完整实体,只会加载选定的属性(通过SQL)。

  

我的想法是从hibernate-search返回一个pk列表,然后将它们传递给我的条件查询。

有人可以这样做,但我不认为这是最好的方法。为此,您需要投影查询。首先是Hibernate Search投影查询以获取实体ID列表,然后是ORM投影查询以从数据库加载属性。如果将相关属性存储在Lucene索引中,则可以完全跳过第二个投影。

所以,如果表现是你的最终目标,那就是你要走的路。你好像担心内存消耗。 IMO Lucene和Hibernate Search在尽可能提高效率方面做得很好。我不会因为过早的优化考虑而抛弃纯粹的Hibernate Search投影方法。