【问题标题】:Spatial query using Hibernate Search always returns an empty result set使用 Hibernate Search 的空间查询总是返回一个空的结果集
【发布时间】:2015-02-17 12:22:35
【问题描述】:

我在使用休眠搜索 (5.0.1) 对 mySQL 数据库 (5.6) 进行空间搜索时遇到问题。

问题确实是查询没有返回任何内容,我相信我已经遵循documentation accurately 并对 JPA 进行了适当的更改。

经度和纬度数据在数据库中正确为 DOUBLE 类型,查询参数应返回大量对象。我完全不知道问题出在哪里,可能我在某个地方错过了一个简单的步骤

这里是查询代码...

public List<Dealership>  getAllDealershipsAroundApplicant(  double centerLatitude, double centerLongitude) {

    FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em)  ;  

    QueryBuilder builder = fullTextEntityManager.getSearchFactory()
      .buildQueryBuilder().forEntity( Dealership.class ).get();

    org.apache.lucene.search.Query luceneQuery = builder.spatial()
              .onDefaultCoordinates()
              .within( 10000, Unit.KM )
              .ofLatitude( 51d )  // HARD CODE
              .andLongitude( 0 )
              .createQuery();

    FullTextQuery hibQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, Dealership.class);

    List<Dealership>  results = (List<Dealership> )hibQuery.getResultList();

    System.out.println( "results: " + results ) ;

    return results;     
}

还有被索引的对象...(每个类继承的表,在超类中带有 ID)

@Spatial(spatialMode = SpatialMode.RANGE)
@Indexed
@Entity
@Audited(targetAuditMode=RelationTargetAuditMode.AUDITED)
@Table(name = "car_dealership")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Dealership extends CarDBEntity {   


    @Latitude
    @Column(name = "latitude")
    private Double latitude ;

    @Longitude
    @Column(name = "longitude")
    private Double longitude ;


    public Double getLatitude() {
        return latitude;
    }

    public void setLatitude(Double latitude) {
        this.latitude = latitude;
    }

    public Double getLongitude() {
        return longitude;
    }

    public void setLongitude(Double longitude) {
        this.longitude = longitude;
    }
            ...

除了编写这些代码部分之外,我没有对数据库进行任何其他更改或在 hibernate/spring(4.1.1) 应用程序中添加任何额外的配置。

任何指针将不胜感激。谢谢

【问题讨论】:

  • 您是否使用 MassIndexer 重建了索引?您需要先构建索引,尤其是在处理现有数据库时。
  • 嗨,是的,这是一个索引器问题,谢谢。我遍历了对象(只有 3000 个)并调用了索引,数据已在容器外更新,当时我并没有完全意识到这一点。 (加上我对 lucene 的了解有限,我不知道这将是我的第一个停靠港。)谢谢
  • 好的,我没想到 :) 现在将其发布为正确答案,因此您可以将其标记为已解决。

标签: java lucene spatial hibernate-search


【解决方案1】:

在现有应用程序中引入 Hibernate Search 时 - 或仅使用现有数据库 - 您需要重建 Lucene 索引。

重建索引意味着 Hibernate 需要从数据库中加载所有索引实体(可能还有它们的索引关系),因此这可能需要一段时间。

最有效的方法是使用 Hibernate Search 中包含的实用程序,称为 MassIndexer

fullTextSession.createIndexer().startAndWait();

此方法将使用高效的仅向前滚动方法并使用一些并发操作来使用所有 CPU 进行索引。 值得阅读MassIndexer reference documentation 以了解其调整选项。

如果您更改索引属性或索引选项,您可能还需要重建索引。

【讨论】:

  • 似乎您的解决方案确实适用于帖子的创建者,但遗憾的是它不适用于我。启动 massindexer 后,我在 Tomcat 的实时日志中看到它确实遍历了数据库中的所有实体。文件系统中的索引文件几乎是空的。之后它仍然返回 0 结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2021-09-04
  • 2017-12-19
  • 2016-12-12
  • 1970-01-01
相关资源
最近更新 更多