我有一个问题,现在我已经苦苦挣扎了好几天。我只是不明白为什么 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
}
我有大约 10 000 000 条记录。距离排序查询耗时 < 1 秒,documentValue(数字字段,甚至标记为 SortableField)排序查询耗时 > 30 秒。
谢谢。
最佳答案
好的,结束这个问题,因为问题的解决方案已经确定。 基本上,根据 Gimby 的建议,我更详细地研究了 SQL 日志记录(由 Hibernate 提供),并注意到有人在进行值排序时引用了其他信息。基本上,在应用程序的 View 中,它们显示了额外的一行信息(地址和电话)。
查看日志后,我注意到,由于地址和电话在另一个表中,页面速度慢得多,因为数据库正在执行顺序扫描以查找地址和电话,因为没有索引在该表中的外键上。我错误地认为所有外键都有索引。修复后,一切正常。
事实证明,这个问题与 Lucene 无关,我对它的研究太深入了(因为我以前从未使用过 Hibernate Search,所以我认为我在那里做错了什么)。相反,我还应该调查其他可能性(启用日志记录、使用分析器、查看线程转储等),而不是浪费几天时间分析 Hibernate Search 和 Lucene 的每一部分。我的错。
关于java - Hibernate Search 对一个查询非常慢,对另一个查询很快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34616914/