我遇到了问题,而且我已经挣扎了好几天了。我只是不明白为什么Hibernate Search对一个查询的工作速度足够快,但对另一个查询来说速度慢。我已经阅读了很多关于stackoverflow,hibernate搜索文档等的相关帖子,但我找不到错误。
我使用的是最新版本的Hibernate Search(5.5.2.Final),以及最新版本的Hibernate ORM和PostgreSQL。
我只会复制重要的代码(你可以看到查询之间的变化),其他一切都完全相同(它是相同的代码,在同一个函数中, ...)
if(latitude != null && longitude != null){
//Distance sort works very fast, no problems here
Sort distanceSort = new Sort(
new DistanceSortField(latitude,
longitude,
"location"));
jpaQuery.setSort(distanceSort);
} else {
//THIS IS SLOW, i have no idea why
Sort valueSort = new Sort(
new SortField("documentValue", SortField.Type.DOUBLE, true)); //reverse, highest values first
jpaQuery.setSort(valueSort);
}
这些字段在Business.java文件中定义(重要代码如下)。
@Spatial(spatialMode = SpatialMode.HASH)
@Transient
public Coordinates getLocation() {
.... //latitude and longitude coordinates are stored in DB
}
@Field
@NumericField
@SortableField
public Double getDocumentValue() {
return documentValue; //this number is stored in DB
}
我有大约1 000 000条记录。距离排序查询采用< 1秒,documentValue(一个数字字段,甚至标记为SortableField)排序查询采用> 30秒。
谢谢。
答案 0 :(得分:1)
好的,关闭这个问题,已经确定了问题的解决方案。 基本上,根据Gimby的建议,我会更详细地研究SQL日志记录(由Hibernate提供),并注意到有人在进行值排序时会引用其他信息。基本上,在应用程序的视图中,他们显示了额外的信息(地址和电话)。
查看日志后,我注意到,由于地址和手机在另一个表中,页面速度要慢得多,因为数据库正在进行顺序扫描以查找地址和电话,因为没有索引在该表中的外键上。我错误地认为所有外键都有索引。一旦修复,一切都正常。
事实证明,这个问题与Lucene无关,我对它的研究太深了(因为我之前从未使用过Hibernate Search,我认为我在那里做错了)。相反,我应该调查其他可能性(启用日志记录,使用分析器,查看线程转储等),而不是浪费几天时间来分析Hibernate Search和Lucene的每一点。我的错。