我有两个不同的数据层,其中第1层可以在全国范围内使用,第2层最多可以使用150英里。为了增加复杂性,我也使用了facet。
我的问题是如何进行多个空间过滤?
如果这是hibernate-search无法使用的功能,有没有办法在每个结果上提供距原点的距离并从中排除结果?
修改
我在下面添加了一个我认为有效的答案,但代价是添加了额外的长/纬度字段。如果有人可以改进它,我会很感激。
答案 0 :(得分:0)
我假设处理此问题的唯一方法是将2个位置绑定到记录和以下代码查询/实体代码。
查询
BooleanQuery luceneQuery = new BooleanQuery();
org.apache.lucene.search.Query query = qb.spatial()
.onField("location")
.within(3000, Unit.KM)
.ofLatitude(_lat)
.andLongitude(_long)
.createQuery();
luceneQuery.add(query, BooleanClause.Occur.SHOULD);
query = qb.spatial()
.onField("location2")
.within(100, Unit.KM)
.ofLatitude(_lat)
.andLongitude(_long)
.createQuery();
luceneQuery.add(query, BooleanClause.Occur.SHOULD);
FullTextQuery jpaQuery =
fullTextSession.createFullTextQuery(luceneQuery, Book.class);
return jpaQuery.list();
实体
private Double latitude;
private Double longitude;
private Double latitude2;
private Double longitude2;
@Spatial(name = "location", spatialMode = SpatialMode.RANGE)
public Coordinates getLocation() {
return new Coordinates() {
@Override
public Double getLatitude() {
return latitude;
}
@Override
public Double getLongitude() {
return longitude;
}
};
}
@Spatial(name = "location2", spatialMode = SpatialMode.RANGE)
public Coordinates getLocation2() {
return new Coordinates() {
@Override
public Double getLatitude() {
return latitude2;
}
@Override
public Double getLongitude() {
return longitude2;
}
};
}