Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc SOLR Spring数据地理空间查询_Spring Mvc_Spring Data Solr - Fatal编程技术网

Spring mvc SOLR Spring数据地理空间查询

Spring mvc SOLR Spring数据地理空间查询,spring-mvc,spring-data-solr,Spring Mvc,Spring Data Solr,我正在使用动态查询来搜索SOLR,并尝试对商店定位器功能执行复杂的地理位置查询。它应该在距离一个位置(点)D的距离内检索最多5个位置。它还应该按距离排序,并在结果中返回距离 但我不知道如何让API输出正确的查询 有人可以指导我如何使用SpringSolrDataAPI来正确地获得这个查询输出吗 我正在使用Solr4+geofilter功能 我需要的SOLR查询是(直接工作): 到目前为止,我的代码是这样的(不起作用): @覆盖 公共SimpleSearchResults searchByRegi

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

但我不知道如何让API输出正确的查询

有人可以指导我如何使用SpringSolrDataAPI来正确地获得这个查询输出吗

我正在使用Solr4+geofilter功能

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

到目前为止,我的代码是这样的(不起作用):

@覆盖
公共SimpleSearchResults searchByRegion(SimpleSearchForm searchForm,region文档区域)
{
logger.entry();
SimpleQuery=新建SimpleQuery();
addCriteria(新条件(“文本”)包含(Criteria.WILDCARD));
整数距离=5;
Point Point=new org.springframework.data.solr.core.geo.Point(region.getLat(),region.getLng());
地理距离函数geo=地理距离函数。从(“位置”)到(点)的距离;
addFilterQuery(新的SimpleFilterQuery(Criteria.where(geo));
SimpleFilterQuery typeQuery=新建SimpleFilterQuery();
typeQuery.addCriteria(新条件(“docType”).is(“位置”);
排序=新排序(Sort.Direction.ASC,“score”);
query.addFilterQuery(类型查询);
//向请求添加分页
PageRequest页面=新的PageRequest(0,5,排序);
query.setPageRequest(第页);
//我们最初构建的搜索请求没有方面
//search.setPageRequest(第页);
页面结果=solrTemplate1.QueryFormage(查询,LocationDocument.class);
logger.exit();
SimpleSearchResults dto2=新的SimpleSearchResults();
dto2.setSearchTerm(searchForm.getSearchTerm());
dto2.setPage(结果);
返回dto2;
}

为了便于参考,我在这里发布了一个解决方案的变体后,成功地实现了这一点:

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

因此,我最终使用了一个简单的字符串标准将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;
    }
@覆盖
公共SimpleSearchResults searchByRegion(SimpleSearchForm searchForm,region文档区域){
logger.entry();
SimpleQuery=新建SimpleQuery();
query.addProjectionOnField(“*”);
query.addProjectionOnField(“分数”);
StringBuffer buf=新的StringBuffer(“”);
追加(“{!geofilt pt=”);
追加(region.getLat());
buf.追加(“,”);
buf.append(region.getLng());
buf.append(“sfield=location d=”);
追加预算(5.0);
追加(“分数=距离}”);
addCriteria(新的SimpleStringCriteria(buf.toString());
FilterQuery docType=新的SimpleFilterQuery();
docType.addCriteria(新标准(“docType”).is(“位置”);
query.addFilterQuery(docType);
addSort(新排序(Sort.Direction.ASC,“score”);
页面结果=solrTemplate1.QueryFormage(查询,LocationDocument.class);
SimpleSearchResults dto2=新的SimpleSearchResults();
dto2.setSearchTerm(searchForm.getSearchTerm());
if(results.getContent().isEmpty()){
debug(“结果为空”);
}否则{
dto2.setPage(结果);
}
logger.exit();
返回dto2;
}
@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;
    }
@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;
    }