【发布时间】: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