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&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;
}
solr-geohsah 按照距离搜索分组的更多相关文章
- 使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析
使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析 使用搜索引擎计数构建快速.高效和可扩展的数据驱动应用程序 Apache Lucene™ 和 Solr™ 是强大的开源搜索技术, ...
- 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第八天】(solr服务器搭建、搜索功能实现)
https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...
- solr多词匹配搜索问题及解决
使用solr进行某较长词搜索时出现了一些问题,及解决方案. 1.问题:solr默认使用OR方式搜索,当搜索一个很长的次,比如“XX集团股份有限公司”,分词器分词后,使用OR方式匹配,会匹配到很多结果. ...
- Lucene全文搜索 分组,精确查找,模糊查找
http://zm603380946.iteye.com/blog/1827318 完全个人理解,如有更好的方法,欢迎一起讨论 LuceneUtils.java package com.zbiti.l ...
- 利用solr实现商品的搜索功能
后期补充: 为什么要用solr服务,为什么要用luncence? 问题提出:当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据 ...
- Solr的精确匹配搜索
情景: 利用Solr做一批词的逆文档频率.Solr中存储的每条数据为一篇文章,此时需要查出某词在多少篇文章中出现过,然后用公式:某词逆文档频率 = 总文章数 / (出现过某词的文章数+1) 来计算. ...
- solr通过http请求搜索
请求搜索必要的条件是:设置搜索条件params 设置 1.简单条件 SolrParams params = new SolrQuery("name:小飞鸟 AND id:1520" ...
- solr安装部署、solr测试创建core、用solrj 访问solr(索引和搜索)
一.安装solr4.8: 1.把apache-solr-4.8.1\example\webapps下的solr.war文件拷贝到Tomcat下的Tomcat7.0\webapps目录下,tomcat启 ...
- Sphinx的GEO距离搜索 [转载]
近项目用sphinx做地理搜索,可是结果总是不对,明明很近却搜不到 结果检查sphinx源文件: static inline double sphSqr ( double v ) { return v ...
随机推荐
- (转)Spring boot——logback.xml 配置详解(四)<filter>
文章转载自:http://aub.iteye.com/blog/1101260,在此对作者的辛苦表示感谢! 1 filter的使用 <filter>: Logback的过滤器基于三值逻辑( ...
- 博弈论之Nim游戏
Nim游戏是组合游戏(Combinatorial Games)的一种,属于“Impartial Combinatorial Games”(以下简称ICG). 通常的Nim游戏的定义是这样的:有若干堆石 ...
- Android学习笔记-绘制圆形ImageView实例
现在很多的APP都很喜欢圆形的头像,这里就简单的写个圆形的ImageView~ 第三方圆形ImageView控件: RoundedImageView CircleImageView 实现代码: 自定义 ...
- 认识sass和webstrom的sass配置
认识sass和webstrom的sass配置 我纳闷啊!电脑死机,我刚才编写的内容全没了. 呵呵! 一.sass的使用 1.首先要到官网下载个稳定的ruby版本,因为sass运行是需要ruby环境 它 ...
- Nginx配置抵御DDOS或CC攻击
防攻击的思路我们都明白,比如限制IP啊,过滤攻击字符串啊,识别攻击指纹啦.可是要如何去实现它呢?用守护脚本吗?用PHP在外面包一层过滤?还是直接加防火墙吗?这些都是防御手段.不过本文将要介绍的是直接通 ...
- 一步一步学习Vue(十一)
本篇继续学习vuex,还是以实例为主:我们以一步一步学Vue(四)中讲述的例子为基础,对其改造,基于vuex重构一遍,这是原始的代码: todolist.js ; (function () { var ...
- 利用dbutils工具实现数据的增删查改操作(dbutis入门)
一.前期准备 1.安装数据库(如:mysql5.5) 2.安装Eclipse(如:3.4) 3.下载数据库驱动包 4.下载dbutis工具包 5.在Eclipse创建名为 dbutils 的工程并在工 ...
- iOS上机题(附个人见解)
##机试题目如下 用命令行创建一个以CocoaPods管理的项目[Test-你的姓名拼音],新建3个ViewController,完成以下题目 将下面的问题在一个UITabView里面列出所有问题,单 ...
- AKOJ -- 1529 -- 寻找最大数
1529: 寻找最大数 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 107 Solved: 53 上一题SubmitStatus标签打分编辑题目信 ...
- 一次使用pywin32学到的知识
FindWindow这个函数检索处理顶级窗口的类名和窗口名称匹配指定的字符串.这个函数不搜索子窗口. FindWindowEx:FindWindowEx是在窗口列表中寻找与指定条件相符的第一个子窗口 ...