java - Hibernate Search 对一个查询非常慢,对另一个查询很快

标签 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
    }

我有大约 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/

相关文章:

Java:JApplet,如何将它嵌入网页?

java - JUnit 测试调试在 IntelliJ IDEA 中挂起

java - 奇怪的 Java 字符串比较

hibernate - 如何使 hibernate hbm2ddl 生成带分号的 SQL?

java - 为什么我需要在 Hibernate 中进行事务以进行只读操作?

sql - 从另一个具有匹配值对的表中插入

ruby-on-rails - Rails 不会为主键使用序列?

sql - 如果表为空如何返回 0,否则返回 1

java - 在我的应用程序中启动倒数计时器,它将独立运行我的应用程序打开或关闭

java - 长范围值的查找