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