SOLR Spring Data地理空间查询

时间:2014-08-23 12:07:28

标签: spring-mvc spring-data-solr

我正在使用动态查询来搜索SOLR,而我正在尝试为商店定位器功能执行复杂的地理位置查询。它应该在距离位置(Point)的距离D内检索多达5个位置。它还应按距离排序,并返回结果中的距离。

我无法弄清楚如何让API输出正确的查询。

有人可以指导我如何使用Spring SOLR Data API正确获取此查询输出吗?

我正在使用SOLR 4+地理过滤器功能。

我需要的SOLR查询是这个(直接工作):

http://localhost:8983/solr/aust/select?q={!func}geodist()&fl=*,score,geodist()&fq={!geofilt}&pt=-37.818635,145.0014704&sfield=location&d=15&fq=docType:LOCATION&rows=5&wt=json&indent=true&sort=score asc

到目前为止我的代码看起来像这样(不工作):

@Override
    public SimpleSearchResults searchByRegion (SimpleSearchForm searchForm, RegionDocument region)
    {
        logger.entry();


        SimpleQuery query = new SimpleQuery();
        query.addCriteria(new Criteria("text").contains(Criteria.WILDCARD));
        int distance = 5;
        Point point = new org.springframework.data.solr.core.geo.Point(region.getLat(), region.getLng());

        GeoDistanceFunction geo = GeoDistanceFunction.distanceFrom("location").to(point);
        query.addFilterQuery(new SimpleFilterQuery(Criteria.where(geo)));
        SimpleFilterQuery typeQuery = new SimpleFilterQuery();
        typeQuery.addCriteria(new Criteria("docType").is("LOCATION"));

        Sort sort = new Sort(Sort.Direction.ASC, "score");
        query.addFilterQuery(typeQuery);

        // add paging to request
        PageRequest page = new PageRequest(0, 5, sort);
        query.setPageRequest(page);

        // we build the search request without facets initially
        //search.setPageRequest(page);
        Page<LocationDocument> results = solrTemplate1.queryForPage(query, LocationDocument.class);

        logger.exit();

        SimpleSearchResults dto2 = new SimpleSearchResults();
        dto2.setSearchTerm(searchForm.getSearchTerm());
        dto2.setPage(results);

        return dto2;
    }

1 个答案:

答案 0 :(得分:0)

作为参考,我设法在此处发布的解决方案的变体后得到了此工作:How to return distance and score in spatial search using spring-data-solr

因为我使用的是SOLR 4类型的location_rpt,所以geodist()函数不支持该类型。因此,在文档中,他们建议使用score参数返回距离。 (注意它以度数的形式返回并需要转换=如果有人知道如何在SOLR上进行转换,那么请在此处发布。)

所以我最终使用一个简单的String Criteria将score = distance短语添加到Geofilter表达式中。

这是我的代码,用于获取地理过滤器的结果,使用Spring Data SOLR API和location_rpt模式类型按距离排序。

@Override
    public SimpleSearchResults searchByRegion(SimpleSearchForm searchForm, RegionDocument region) {
        logger.entry();


        SimpleQuery query = new SimpleQuery();
        query.addProjectionOnField("*");
        query.addProjectionOnField("score");

        StringBuffer buf = new StringBuffer("");
        buf.append("{!geofilt pt=");
        buf.append(region.getLat());
        buf.append(",");
        buf.append(region.getLng());
        buf.append(" sfield=location d=");
        buf.append(5.0);
        buf.append(" score=distance}");

        query.addCriteria(new SimpleStringCriteria(buf.toString()));

        FilterQuery docType = new SimpleFilterQuery();
        docType.addCriteria(new Criteria("docType").is("LOCATION"));

        query.addFilterQuery(docType);

        query.addSort(new Sort(Sort.Direction.ASC, "score"));

        Page<LocationDocument> results = solrTemplate1.queryForPage(query, LocationDocument.class);


        SimpleSearchResults dto2 = new SimpleSearchResults();
        dto2.setSearchTerm(searchForm.getSearchTerm());

        if (results.getContent().isEmpty()) {
            logger.debug("results were empty.");
        } else {
            dto2.setPage(results);
        }

        logger.exit();

        return dto2;
    }