solr-geohsah 按照距离搜索分组

通过solr的domain-import,将mysql的数据通过查询,导入到solr中。java通过使用solrj,链接solr,调用domaininport,并将分页参数设置到domain-import中(防止查询所有数据),通过线程sleep,查询solr导入情况,如果导入成功,则继续导入下一页,直到所有数据导入完成。数据导入完成之后,客户端通过地图的缩放等级,发送当前位置的精度纬度,以及当前地图显示的最大距离,将数据发送值服务器,服务器通过查询solr中数据,将对应数据所在的经纬度、统计等信息返回给客户端。

solr chema配置

<fieldtype name="geohash" class="solr.GeoHashField"/>
从数据导入solr配置<dataConfig>
    <dataSource type="JdbcDataSource"
              driver="com.mysql.jdbc.Driver"
              url="jdbc:mysql://192.168.211.226:3306/adwl_dev_v2?useUnicode=true&amp;characterEncoding=utf8"
              user="root"
              password="111111" />
    <document>
        <entity name="solr_docking_insert" transformer="DateFormatTransformer"
            query="    sql查询*** limit ${dataimporter.request.startpage},${dataimporter.request.endpage}">

        </entity>
    </document>
</dataConfig>
//动态调用SolrDomainImport
public static String importData(Long start,String url){
        System.out.println("货源导入数据开始:"+start+" "+perPage);
        Map<String , String> map=new HashMap<String, String>();
        if(isclear){
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            isclear=false;
            map.put("clean", "true");
        }else{
            map.put("clean", "false");
        }
        map.put("command", "full-import");
        map.put("commit", "true");
        map.put("debug", "false");
        map.put("endpage", perPage+"");
        map.put("indent", "true");
        map.put("optimize", "false");
        map.put("startpage", start+"");
        map.put("verbose", "false");
        map.put("wt", "json");
        //向移动交互服务发送httppost请求
        String str= HttpPostUtil.doPost(url, map,null);
        return str;
    }
    public SimpleResult groupCargo(LbsSearchRequestDto lbsSearchRequestDto){
        try{
        if(lbsSearchRequestDto==null)
            return new SimpleResult("body不能为空", StateCode.VALIDATOR_FAIL, null, false);
        LbsSearchBodyDto lbsBdoy=lbsSearchRequestDto.getBodyDto();
        if(lbsBdoy.getLevel()==null)
            return new SimpleResult("Level不能为空", StateCode.VALIDATOR_FAIL, null, false);
        List<String> fl=new ArrayList<String>();
        //level为省级按照省分组
        if(lbsBdoy.getLevel()==1){
            fl.add("rciShipperCity:notfind");
            fl.add("rciShipperArea:notfind");
        //level为市级按照市分组
        }else if(lbsBdoy.getLevel()==2){
            fl.add("rciShipperArea:notfind");
            fl.add("-rciShipperCity:notfind");
        //level为区县级按照区县分组
        }else if(lbsBdoy.getLevel()==3){
            fl.add("-rciShipperArea:notfind");
        }
        if(lbsBdoy.getPageSize()==null)lbsBdoy.setPageSize(0);
        if(lbsBdoy.getPageNumber()==null)lbsBdoy.setPageNumber(50);
        //按照经纬度和距离查询
        PageData data=solrCargoLLSearch.queryLL(lbsBdoy.getPageSize(), lbsBdoy.getPageNumber(), lbsBdoy.getD(), "geohash", lbsBdoy.getLat(),lbsBdoy.getLon(), fl);

        LbsSearchGroupResponseDto lsgrb=new LbsSearchGroupResponseDto();
        LbsSearchGroupResponseBodyDto lsgrbd=new LbsSearchGroupResponseBodyDto();
        lsgrb.setBodyDto(lsgrbd);
        List<LbsGroupMsg> lbsGroupMsgs=new ArrayList<LbsGroupMsg>();
        String solrMsg=data.getData();
        JSONArray array=JSONArray.parseArray(solrMsg);
        for(int i=0;i<array.size();i++){
            //TODO数据整合
        }
        lsgrbd.setLbsGroupMsgs(lbsGroupMsgs);
        return new SimpleResult("成功", 200, lsgrbd, true);
        }catch(Exception e){
            e.printStackTrace();
            return new SimpleResult("服务器错误", 500, null, true);
        }

    }
/**
     *
     * @param orderField 排序字段 必须为index字段
     * @param start 分页开始值
     * @param rows 分页结束值
     * @param filters 条件
     * @return
     */
    public  PageData  queryDataArrays(String orderField,Integer start,Integer rows,Map<String, String>latAndlon,List<String>filters){
        PageData pageData=null;
        //HttpSolrServer server = SolrServerFactory.getCargoServer();
        SolrQuery query =  new SolrQuery(q);
        query.setStart(start);
        query.setRows(rows);
        if(null!=latAndlon){
            query.addFilterQuery("{!geofilt}");
            Set<String>set=latAndlon.keySet();
            for(String key:set){
                System.out.println(key+" : "+latAndlon.get(key));
                query.set(key, latAndlon.get(key));
            }
        }
        if(filters!=null)
            for(String filter:filters)
                query.addFilterQuery(filter);

        if(orderField!=null)
            query.addSort(orderField, ORDER.desc);
        try {
            QueryResponse rsp = getServer().query(query);
            SolrDocumentList docs = rsp.getResults();
            pageData=new PageData();
            pageData.setSize(docs.getNumFound());
            pageData.setData(getJsons(docs));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         return pageData;
    }
时间: 2024-08-29 10:55:26

solr-geohsah 按照距离搜索分组的相关文章

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第八天】(solr服务器搭建、搜索功能实现)

https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结[第五天] 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结[第六天] 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)[第七天](redis缓存) 第04

solr+采集程序合并搜索服务器

需求: 1,从数据库中获取目标url,用爬虫程序获取页面标题正文,加入solr服务器: 2,solr服务器提供前台做查询服务: 3,solrj做客户端提交数据. note:曾考虑为什么用solr不用关系型数据库,大数据文本搜索以及分词,solr搜索效率比mysql更高. STEP:1 下载solr3.4.0:http://archive.apache.org/dist/lucene/solr/3.4.0/ 生产环境使用该版本(现最新版本5.3) STEP:2 http://blog.csdn.n

利用solr实现商品的搜索功能

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展,并对索引.搜索性能进行了优化. Solr是一个全文检索服务器,只需要进行配置就可以实现全文检索服务.有效降低频繁访问数据库对数据库造成的压力. 第一步:将solr部署在linux系统下. 第二步:solrJ是solr的客户端,使用它需要依赖solrJ的jar包. 第三步:将数据库的内容添加到solr的索引库,这样查询就在索

按距离搜索邻近城市的一种实现

以下内容来至https://cloud.tencent.com/developer/article/1008487,仅做备忘. 简介 现在几乎所有的O2O应用中都会存在“按范围搜素.离我最近.显示距离”等等基于位置的交互,那这样的功能是怎么实现的呢?本文提供的实现方式,适用于所有数据库. 实现 为了方便下面说明,先给出一个初始表结构,我使用的是MySQL: CREATE TABLE `customer` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMEN

配置solr客户端(全文搜索服务器)

<properties> <solrj.version>4.10.3</solrj.version> </properties> <dependencyManagement> <dependencies> <!-- solr客户端 --> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solr

solr相关配置(搜索novel案例)

managed-schema <?xml version="1.0" encoding="UTF-8" ?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional inform

solr教程,值得刚接触搜索开发人员一看

Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在查询中可以应用的高亮显示.拼写检查.搜索建议.分组统计.拼音检索等功能的使用方法. 版本 作者/修改人 日期 V1.0 gzk 2013-06-04       1. Solr 是什么? Solr它是一种开放源码的.基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中.Solr

solr特点八:Spatial(空间搜索)

前言 在美团CRM系统中,搜索商家的效率与公司的销售额息息相关,为了让BD们更便捷又直观地去搜索商家,美团CRM技术团队基于Solr提供了空间搜索功能,其中移动端周边商家搜索和PC端的地图模式搜索功能为BD们的日常工作带来了很大的便利,大大提升了BD们的工作效率. 在本文中,首先对空间搜索的原理进行简单介绍,然后再结合具体的业务场景去分享美团使用空间搜索的实践. 空间搜索原理 空间搜索,又名Spatial Search,基于空间搜索技术,可以做到: 1)对Point(经纬度)和其他的几何图形建索

全文搜索技术——Solr

1.   学习计划 1. Solr的安装及配置 a)    Solr整合tomcat b)    Solr后台管理功能介绍 c)    配置中文分析器 2. 使用Solr的后台管理索引库 a)    添加文档 b)     删除文档 c)    修改文档 d)    查询文档 3. 使用SolrJ管理索引库 a)    添加文档 b)    修改文档 c)    删除文档 d)    查询文档 4. 电商搜索案例实现 a)    案例分析 b)    案例实现 2.   需求分析 使用Solr实