hibernate搜索多个空间限制

时间:2015-03-05 18:51:22

标签: hibernate hibernate-search

我有两个不同的数据层,其中第1层可以在全国范围内使用,第2层最多可以使用150英里。为了增加复杂性,我也使用了facet。

我的问题是如何进行多个空间过滤?

如果这是hibernate-search无法使用的功能,有没有办法在每个结果上提供距原点的距离并从中排除结果?

修改

我在下面添加了一个我认为有效的答案,但代价是添加了额外的长/纬度字段。如果有人可以改进它,我会很感激。

1 个答案:

答案 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;
        }
    };
}