Hibernate Search对于一个查询来说非常慢,对另一个查询来说速度很快

时间:2016-01-05 16:47:12

标签: java hibernate postgresql lucene hibernate-search

我遇到了问题,而且我已经挣扎了好几天了。我只是不明白为什么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秒。

谢谢。

1 个答案:

答案 0 :(得分:1)

好的,关闭这个问题,已经确定了问题的解决方案。 基本上,根据Gimby的建议,我会更详细地研究SQL日志记录(由Hibernate提供),并注意到有人在进行值排序时会引用其他信息。基本上,在应用程序的视图中,他们显示了额外的信息(地址和电话)。

查看日志后,我注意到,由于地址和手机在另一个表中,页面速度要慢得多,因为数据库正在进行顺序扫描以查找地址和电话,因为没有索引在该表中的外键上。我错误地认为所有外键都有索引。一旦修复,一切都正常。

事实证明,这个问题与Lucene无关,我对它的研究太深了(因为我之前从未使用过Hibernate Search,我认为我在那里做错了)。相反,我应该调查其他可能性(启用日志记录,使用分析器,查看线程转储等),而不是浪费几天时间来分析Hibernate Search和Lucene的每一点。我的错。