使用Hibernate Search的空间查询始终返回空结果集

时间:2015-02-17 12:22:36

标签: java lucene spatial hibernate-search

我在使用hibernate search(5.0.1)进行mySQL数据库(5.6)的空间搜索时遇到了问题。

问题实际上并没有从查询中返回,我相信我已经跟随documentation accurately并对JPA进行了适当的更改。

经度和纬度数据在DB中正确为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;
    }
            ...

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

任何指示都将不胜感激。感谢

1 个答案:

答案 0 :(得分:2)

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

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

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

fullTextSession.createIndexer().startAndWait();

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

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