Commit a44ce055 by Jiabeibei_glb

Merge remote-tracking branch 'origin/dev' into dev

parents 4d069ae3 6da15f83
package com.founder.commonutils.esEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author chent
* @since 2021-03-10
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("TB_ZY_KKXX")
@ApiModel(value="TbZyKkxx对象", description="")
public class TbZyKkxx implements Serializable {
private static final long serialVersionUID = 1L;
@TableField("MY_ID_HASH")
private String myIdHash;
@TableField("MY_VALUE_MD5")
private String myValueMd5;
@TableField("MY_CREATE_DATE")
private String myCreateDate;
@ApiModelProperty(value = "卡口id")
@TableField("ID")
private String id;
@ApiModelProperty(value = "卡口编号")
@TableField("CODE")
private String code;
@ApiModelProperty(value = "卡口名称")
@TableField("NAME")
private String name;
@ApiModelProperty(value = "卡口类型")
@TableField("TYPE")
private String type;
@TableField("EXT")
private String ext;
@ApiModelProperty(value = "行政区划省代码")
@TableField("ORGUNITID")
private String orgunitid;
@ApiModelProperty(value = "经度")
@TableField("X")
private String x;
@ApiModelProperty(value = "纬度")
@TableField("Y")
private String y;
@ApiModelProperty(value = "序列号")
@TableField("ORDERNO")
private String orderno;
@TableField("MAPPINGID")
private String mappingid;
@TableField("SJGXSJ")
private String sjgxsj;
@TableField("PRE_FORMAT_SJGXSJ")
private String preFormatSjgxsj;
@TableField("ETL_TIME_TAR")
private String etlTimeTar;
@TableField("PRE_FORMAT_ETL_TIME_TAR")
private String preFormatEtlTimeTar;
}
...@@ -53,7 +53,14 @@ public class MapRestResult<T> { ...@@ -53,7 +53,14 @@ public class MapRestResult<T> {
r.setMsg("失败"); r.setMsg("失败");
return r; return r;
} }
//--------6---------------
public static <T> MapRestResult error(String msg) {
MapRestResult r = new MapRestResult();
r.setStatus(ResultCode.ERROR);
r.setMsg("error");
r.setMsg(msg);
return r;
}
public MapRestResult() { public MapRestResult() {
this.status = 200; this.status = 200;
......
...@@ -14,16 +14,6 @@ public class RequestBean implements Serializable { ...@@ -14,16 +14,6 @@ public class RequestBean implements Serializable {
private GeographicInfo geographicInfo;//空间信息 private GeographicInfo geographicInfo;//空间信息
//private rbss rbss;//查询条件 //private rbss rbss;//查询条件
private String poiname;
public String getPoiname() {
return poiname;
}
public void setPoiname(String poiname) {
this.poiname = poiname;
}
public String getIndex() { public String getIndex() {
return index; return index;
} }
......
...@@ -16,7 +16,7 @@ public class GlobalExceptionHandler { ...@@ -16,7 +16,7 @@ public class GlobalExceptionHandler {
@ResponseBody //为了返回数据 @ResponseBody //为了返回数据
public MapRestResult error(Exception e) { public MapRestResult error(Exception e) {
e.printStackTrace(); e.printStackTrace();
return MapRestResult.error().message("执行了全局异常处理.."); return MapRestResult.error("执行了全局异常处理..");
} }
//特定异常 //特定异常
...@@ -24,7 +24,7 @@ public class GlobalExceptionHandler { ...@@ -24,7 +24,7 @@ public class GlobalExceptionHandler {
@ResponseBody //为了返回数据 @ResponseBody //为了返回数据
public MapRestResult error(ArithmeticException e) { public MapRestResult error(ArithmeticException e) {
e.printStackTrace(); e.printStackTrace();
return MapRestResult.error().message("执行了ArithmeticException异常处理.."); return MapRestResult.error("执行了ArithmeticException异常处理..");
} }
//自定义异常 //自定义异常
...@@ -34,7 +34,7 @@ public class GlobalExceptionHandler { ...@@ -34,7 +34,7 @@ public class GlobalExceptionHandler {
log.error(e.getMessage()); log.error(e.getMessage());
e.printStackTrace(); e.printStackTrace();
return MapRestResult.error().code(e.getCode()).message(e.getMsg()); return MapRestResult.build(e.getCode(),e.getMsg(),"");
} }
} }
...@@ -133,7 +133,7 @@ ...@@ -133,7 +133,7 @@
<!--开发环境:打印控制台--> <!--开发环境:打印控制台-->
<springProfile name="dev"> <springProfile name="dev">
<!--可以输出项目中的debug日志,包括mybatis的sql日志--> <!--可以输出项目中的debug日志,包括mybatis的sql日志-->
<logger name="com.guli" level="INFO" /> <logger name="com.founder" level="INFO" />
<!-- <!--
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
......
...@@ -61,16 +61,16 @@ public class CodeGenerator { ...@@ -61,16 +61,16 @@ public class CodeGenerator {
//包 com.atguigu.eduservice //包 com.atguigu.eduservice
pc.setParent("com.founder"); pc.setParent("com.founder");
//包 com.atguigu.eduservice.controller //包 com.atguigu.eduservice.controller
pc.setController("controller"); //pc.setController("controller");
pc.setEntity("entity"); pc.setEntity("entity");
pc.setService("service"); // pc.setService("service");
pc.setMapper("mapper"); // pc.setMapper("mapper");
mpg.setPackageInfo(pc); mpg.setPackageInfo(pc);
// 5、策略配置 // 5、策略配置
StrategyConfig strategy = new StrategyConfig(); StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("TB_ZY_JZXX");//生成的表 strategy.setInclude("TB_ZY_KKXX");//生成的表
strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略 strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀 strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀
......
...@@ -3,7 +3,8 @@ package com.founder.eszy.controller; ...@@ -3,7 +3,8 @@ package com.founder.eszy.controller;
import com.founder.commonutils.publicEntity.MapRestResult; import com.founder.commonutils.publicEntity.MapRestResult;
import com.founder.eszy.esExtract.EsTbZyJzxxTranslation; import com.founder.eszy.esExtract.EsTbZyJzxxTranslation;
import com.founder.eszy.esSearch.esSearch; import com.founder.eszy.esExtract.EsTbZyKkxxTranslation;
import com.founder.eszy.esSearch.EsSearch;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
...@@ -17,20 +18,38 @@ public class EsExtractController { ...@@ -17,20 +18,38 @@ public class EsExtractController {
@Autowired @Autowired
private EsTbZyJzxxTranslation esTbZyJzxxTranslation; private EsTbZyJzxxTranslation esTbZyJzxxTranslation;
@Autowired @Autowired
private esSearch esSearch; private EsTbZyKkxxTranslation esTbZyKkxxTranslation;
@Autowired
private EsSearch esSearch;
@Value("${jz_index}") @Value("${jz_index}")
private String jz_index; private String jz_index;
@Value("${kk_index}")
private String kk_index;
//基站 //基站
@ApiOperation(value = "基站es全量抽取") @ApiOperation(value = "基站es全量抽取")
@GetMapping("/jzxx") @GetMapping("/jzxx")
public MapRestResult syss() { public MapRestResult jzxx() {
System.out.println("jzxxES开始========================="); System.out.println("jzxxES开始=========================");
try { try {
esTbZyJzxxTranslation.SyssEsSave(); esTbZyJzxxTranslation.jzxxEsSave();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
int count = (int) esSearch.EScount(jz_index); int count = (int) esSearch.EScount(jz_index);
return MapRestResult.build(200,"基站数据抽取完成", count); return MapRestResult.build(200,"基站数据抽取完成", count);
} }
//卡口
@ApiOperation(value = "卡口es全量抽取")
@GetMapping("/kkxx")
public MapRestResult kkxx() {
System.out.println("kkxxES开始=========================");
try {
esTbZyKkxxTranslation.kkxxEsSave();
} catch (Exception e) {
e.printStackTrace();
}
int count = (int) esSearch.EScount(kk_index);
return MapRestResult.build(200,"卡口数据抽取完成",count);
}
} }
...@@ -4,6 +4,7 @@ import com.founder.commonutils.publicEntity.GeographicInfo; ...@@ -4,6 +4,7 @@ import com.founder.commonutils.publicEntity.GeographicInfo;
import com.founder.commonutils.publicEntity.MapRestResult; import com.founder.commonutils.publicEntity.MapRestResult;
import com.founder.commonutils.publicEntity.RequestBean; import com.founder.commonutils.publicEntity.RequestBean;
import com.founder.eszy.esSearch.EsTbZyJzxxTranslationQuery; import com.founder.eszy.esSearch.EsTbZyJzxxTranslationQuery;
import com.founder.eszy.esSearch.EsTbZyKkxxTranslationQuery;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
...@@ -21,6 +22,8 @@ import java.util.Map; ...@@ -21,6 +22,8 @@ import java.util.Map;
public class EsQueryController { public class EsQueryController {
@Autowired @Autowired
private EsTbZyJzxxTranslationQuery esTbZyJzxxTranslationQuery; private EsTbZyJzxxTranslationQuery esTbZyJzxxTranslationQuery;
@Autowired
private EsTbZyKkxxTranslationQuery esTbZyKkxxTranslationQuery;
//基站搜索 //基站搜索
@ApiOperation(value = "基站查询") @ApiOperation(value = "基站查询")
@RequestMapping(value = "/getTbZyJzxxList",method = RequestMethod.POST) @RequestMapping(value = "/getTbZyJzxxList",method = RequestMethod.POST)
...@@ -57,4 +60,40 @@ public class EsQueryController { ...@@ -57,4 +60,40 @@ public class EsQueryController {
return MapRestResult.build(200,"成功查询基站数据",result.size()+"",result); return MapRestResult.build(200,"成功查询基站数据",result.size()+"",result);
} }
} }
//基站搜索
@ApiOperation(value = "卡口查询")
@RequestMapping(value = "/getTbZyKkxxList",method = RequestMethod.POST)
public MapRestResult getTbZyKkxxList(@RequestBody RequestBean bean) throws Exception {
List<Map<String,Object>> result= new ArrayList<>();
//按区域范围查询es数据
if(bean.getGeographicInfo()!=null&&!StringUtils.isEmpty(bean.getGeographicInfo())){
GeographicInfo geographicInfo =bean.getGeographicInfo();
String distance=geographicInfo.getDistance();
//判断是否是圆
if(distance!=null&&distance!=""){
org.elasticsearch.common.geo.GeoPoint point=geographicInfo.getPoint();
if (distance == null || point == null){
return null;
}
try {
result = esTbZyKkxxTranslationQuery.searchGeoDistance(bean.getIndex(),bean.getType(),geographicInfo.getField(),distance,point);
}catch (Exception e){
e.printStackTrace();
}
return MapRestResult.build(200,"成功查询卡口数据",result.size()+"",result);
}else{
try {
result = esTbZyKkxxTranslationQuery.searchGeoPolygon(bean.getIndex(),bean.getType(),geographicInfo.getField(),geographicInfo.getPoints());
}catch (Exception e){
e.printStackTrace();
}
return MapRestResult.build(200,"成功查询卡口数据",result.size()+"",result);
}
}
//不带区域信息查询es数据
else{
result = esTbZyKkxxTranslationQuery.searchQuery(bean.getIndex(),bean.getType(),null,null);
return MapRestResult.build(200,"成功查询卡口数据",result.size()+"",result);
}
}
} }
...@@ -31,7 +31,7 @@ public class EsTbZyJzxxTranslation { ...@@ -31,7 +31,7 @@ public class EsTbZyJzxxTranslation {
@Value("${jz_index}") @Value("${jz_index}")
private String jz_index; private String jz_index;
//批量导入es-------------------------------------------------------------------- //批量导入es--------------------------------------------------------------------
public MapRestResult SyssEsSave() throws Exception { public MapRestResult jzxxEsSave() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
ExecutorService executorService = Executors.newCachedThreadPool();//按需分配线程池 ExecutorService executorService = Executors.newCachedThreadPool();//按需分配线程池
Receiving receiving = new Receiving(); Receiving receiving = new Receiving();
...@@ -62,9 +62,9 @@ public class EsTbZyJzxxTranslation { ...@@ -62,9 +62,9 @@ public class EsTbZyJzxxTranslation {
receiving.setBegin(startnum+""); receiving.setBegin(startnum+"");
receiving.setEnd(endnum+""); receiving.setEnd(endnum+"");
//System.out.println("批量分流===========开始"+startnum+"===结束==="+endnum); //System.out.println("批量分流===========开始"+startnum+"===结束==="+endnum);
List<TbZyJzxx> syssList = tbZyJzxxMapper.selectTbZyJzxxList(receiving); List<TbZyJzxx> list = tbZyJzxxMapper.selectTbZyJzxxList(receiving);
System.out.println("批量分流===========开始"+startnum+"===结束==="+endnum+"====总数"+syssList.size()); System.out.println("批量分流===========开始"+startnum+"===结束==="+endnum+"====总数"+list.size());
HandleThread thread = new HandleThread(syssList,jz_index); HandleThread thread = new HandleThread(list,jz_index);
executorService1.execute(thread); executorService1.execute(thread);
} }
return null; return null;
......
package com.founder.eszy.esExtract;
import com.founder.commonutils.esEntity.TbZyKkxx;
import com.founder.commonutils.publicEntity.MapRestResult;
import com.founder.commonutils.publicEntity.Receiving;
import com.founder.eszy.mapper.TbZyKkxxMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by chent 20210309
*/
@Service
public class EsTbZyKkxxTranslation {
@Autowired
private TbZyKkxxMapper tbZyKkxxMapper;
@Autowired
private TbZyKkxxEs es;
@Value("${kk_count}")
private int kk_count;
@Value("${kk_limit}")
private int kk_limit;
@Value("${kk_begin}")
private int kk_begin;
@Value("${kk_index}")
private String kk_index;
//批量导入es--------------------------------------------------------------------
public MapRestResult kkxxEsSave() throws Exception {
long start = System.currentTimeMillis();
ExecutorService executorService = Executors.newCachedThreadPool();//按需分配线程池
Receiving receiving = new Receiving();
//receiving.setValue("'A01D67B67AA513CFE0530E07920A9B35','A01D67BAC6D613DBE0530E07920A6998'");
//分院
int size =kk_count;
int limit=kk_limit;
//特殊处理
if(limit==0){
limit=1;
}
long threadNum = size / limit;
int startnum = 0;
int endnum = 0;
ExecutorService executorService1 = Executors.newCachedThreadPool();//按需分配线程池
for (int i = kk_begin; i < threadNum + 1; i++) {
startnum = i * limit+1;
endnum = ((i + 1) * limit);
if (startnum > size) {
break;
}
if (endnum >size) {
endnum = size;
}
if (startnum == endnum) {
break;
}
receiving.setBegin(startnum+"");
receiving.setEnd(endnum+"");
//System.out.println("批量分流===========开始"+startnum+"===结束==="+endnum);
List<TbZyKkxx> list = tbZyKkxxMapper.selectTbZyKkxxList(receiving);
System.out.println("批量分流===========开始"+startnum+"===结束==="+endnum+"====总数"+list.size());
HandleThread thread = new HandleThread(list,kk_index);
executorService1.execute(thread);
}
return null;
}
class HandleThread extends Thread {
private List<TbZyKkxx> data;
private String index;
public HandleThread(List<TbZyKkxx> data,String index) {
this.data = data;
this.index=index;
}
public void run() {
es.bulkCommit(data,index);
}
}
}
...@@ -127,7 +127,7 @@ public class TbZyJzxxEs { ...@@ -127,7 +127,7 @@ public class TbZyJzxxEs {
//es 特需 //es 特需
map.put("xy",e.getY()+","+e.getX()); map.put("xy",e.getY()+","+e.getX());
bulkRequest.add(esClient.prepareIndex(indexName, "pointdata",e.getCid()).setSource(map)); bulkRequest.add(esClient.prepareIndex(indexName, "pointdata",e.getCid()).setSource(map));//type(pointdata)
bulkRequest.execute().actionGet(); bulkRequest.execute().actionGet();
} catch (Exception e1 ) { } catch (Exception e1 ) {
e1.printStackTrace(); e1.printStackTrace();
......
package com.founder.eszy.esExtract;
import com.founder.commonutils.esEntity.TbZyKkxx;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by chentian on 2021-3-9
*/
@Service
public class TbZyKkxxEs {
/**
* 一 创建索引方法 批量提交时 调这个方法
*/
// model 索引前缀名 比如 user
// reportTime 当前入库日期 比如20200514
// 组合起来就是 user-20200514
// 查询的时候如果想查所有user 索引名称可以是:user-*
//createESIndex(model + "-" + reportTime);
@Autowired
private Client esClient;
public void createESIndex(String indexName) {
IndicesExistsResponse response = esClient.admin().indices()
.exists(new IndicesExistsRequest().indices(new String[] { indexName })).actionGet();
if (response.isExists()) {
return;
}
Map<String, Object> setting = new HashMap<String, Object>();
setting.put("number_of_shards", 3);//这个自己设个数吧。我也没搞清应该设置成多少合适。你设置成3-5比较合适。
setting.put("max_result_window", 10000000);
setting.put("number_of_replicas", 2); //根据需求配置。尽量不要设置为0。可以设置成es集群机器数量
//setting.put("refresh_interval", "120s"); //你这儿不需要配置
CreateIndexRequestBuilder cib = esClient.admin().indices().prepareCreate(indexName).setSettings(setting);
// 这些都是字段名
XContentBuilder mapping = null;
try {
mapping = XContentFactory.jsonBuilder().startObject().startObject("pointdata")//这是type
.startObject("properties")// <br>//不动
/**
* 底下这些是字段 ctrl+shift+u
* .field("index", false) 不建立索引,凡是查询条件,建议加上索引,提升查询速度
*/
.startObject("myIdHash").field("type", "keyword").endObject().field("index", false).endObject()
.startObject("myValueMd5").field("type", "keyword").endObject().field("index", false).endObject()
.startObject("myCreateDate").field("type", "keyword").endObject().field("index", false).endObject()
.startObject("id").field("type", "keyword").endObject()//主键,卡口id
.startObject("code").field("type", "keyword").endObject()//卡口编码
.startObject("name").field("type", "keyword").endObject()
.startObject("type").field("type", "keyword").endObject()
.startObject("ext").field("type", "keyword").endObject()
.startObject("orgunitid").field("type", "keyword").endObject()
.startObject("x").field("type", "keyword").field("index", false).endObject()
.startObject("y").field("type", "keyword").field("index", false).endObject()
.startObject("xy").field("type", "geo_point").endObject()//经纬度特殊处理
.startObject("orderno").field("type", "keyword").field("index", false).endObject()
.startObject("mappingid").field("type", "keyword").field("index", false).endObject()
.startObject("sjgxsj").field("type", "keyword").field("index", false).endObject().endObject()
.startObject("preFormatSjgxsj").field("type", "keyword").endObject().field("index", false).endObject()
.startObject("etlTimeTar").field("type", "keyword").endObject().field("index", false).endObject()
.startObject("preFormatEtlTimeTar").field("type", "keyword").endObject().field("index", false).endObject()
//更新时间
// .startObject("updatedtime").field("type", "keyword").endObject()//修改时间
.endObject().endObject().endObject();
cib.addMapping("pointdata", mapping);
cib.execute().actionGet();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 二 插入数据
*/
//查询oracle
// 如果有id,可以根据where条件 每次查一万条数据(10000>id>=1,20000>id>=10000。写个计算方法) 放到list里。
//起个多线程。每个线程去执行这一万条数据
/* for(int i=0;i<1000;i++){
String sql = "";
//调查询
List<E> result = ;//查询结果
//调用批量bulk提交方法
bulkCommit(result);
}
}*/
/**
* 批量提交方法
* @param result
*/
public String bulkCommit(List<TbZyKkxx> result, String indexName) {
for (TbZyKkxx e : result) {
try {
createESIndex(indexName);
BulkRequestBuilder bulkRequest = esClient.prepareBulk();
Map<String, Object> map = new HashMap<String, Object>();
//对应es字段
map.put("myIdHash", e.getMyIdHash());
map.put("myValueMd5",e.getMyValueMd5());
map.put("myCreateDate",e.getMyCreateDate());
map.put("id",e.getId());//主键
map.put("code",e.getCode());
map.put("name",e.getName());
map.put("type",e.getType());
map.put("ext",e.getExt());
map.put("orgunitid",e.getOrgunitid());
map.put("x",e.getX());
map.put("y",e.getY());
map.put("orderno",e.getOrderno());
map.put("mappingid",e.getMappingid());
map.put("sjgxsj",e.getSjgxsj());
map.put("preFormatSjgxsj",e.getPreFormatSjgxsj());
map.put("etlTimeTar",e.getEtlTimeTar());
map.put("preFormatEtlTimeTar",e.getPreFormatEtlTimeTar());
//es 特需
map.put("xy",e.getY()+","+e.getX());
bulkRequest.add(esClient.prepareIndex(indexName, "pointdata",e.getId()).setSource(map));//type(pointdata)
bulkRequest.execute().actionGet();
} catch (Exception e1 ) {
e1.printStackTrace();
}
}
return "true";
}
}
\ No newline at end of file
...@@ -12,7 +12,7 @@ import org.springframework.stereotype.Service; ...@@ -12,7 +12,7 @@ import org.springframework.stereotype.Service;
* Created by admin on 2020/5/14. * Created by admin on 2020/5/14.
*/ */
@Service @Service
public class esSearch { public class EsSearch {
/** /**
* 一 创建索引方法 批量提交时 调这个方法 * 一 创建索引方法 批量提交时 调这个方法
*/ */
......
package com.founder.eszy.esSearch; package com.founder.eszy.esSearch;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.geo.GeoPoint;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.GeoDistanceSortBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.util.*;
/** /**
* Created by chent on 2021-3-9 * Created by chent on 2021-3-9
*/ */
@Service @Service
public class EsTbZyJzxxTranslationQuery { public class EsTbZyJzxxTranslationQuery extends EsTranslationQuery{
@Autowired
private QueryFactory factory;
@Autowired
private Client client;
private static Logger logger = LoggerFactory.getLogger(EsTbZyJzxxTranslationQuery.class);
/**
* 查找位于多边形中的位置
* @param index 索引
* @param type 类型
* @param field 索引字段
* @param points 构成多边形的点
*/
public List<Map<String, Object>> searchGeoPolygon(String index, String type, String field, List<GeoPoint> points) throws Exception {
GeoPolygonQueryBuilder qb = factory.builtPolygonQuery(field, points);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.filter(qb);
return searchQuery(index, type, boolQueryBuilder,null);
}
/**
* 查询距离中心点指定的范围内的位置
* @param index index
* @param type type
* @param field 索引字段
* @param distance 距离
* @param point 中心点
* @return
* @throws Exception
*/
public List<Map<String, Object>> searchGeoDistance(String index, String type, String field, String distance, GeoPoint point) throws Exception {
Map<String, Object> map = factory.builtDistanceQuery(field, distance, point);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
QueryBuilder qb = (QueryBuilder) map.get("qb");
//按距离排序
GeoDistanceSortBuilder sort = (GeoDistanceSortBuilder) map.get("sort");
boolQueryBuilder.filter(qb);
return searchQuery(index, type, boolQueryBuilder,sort);
}
/**
* 基础查询
* @param index 索引
* @param type type
* @return List<Map>
*/
public List<Map<String, Object>> searchQuery(String index, String type, BoolQueryBuilder boolQueryBuilder, GeoDistanceSortBuilder sort) {
//基础查询不带空间检索
if(boolQueryBuilder==null&& StringUtils.isEmpty(boolQueryBuilder)) {
BoolQueryBuilder bq = QueryBuilders.boolQuery();
return search(index, type, bq, sort);
}else{
//基础查询带空间检索
return search(index, type, boolQueryBuilder, sort);
}
}
/**
* 执行查询
* @param index 索引
* @param type type
* @param builder 查询语句
* @return List<Map>
*/
private List<Map<String, Object>> search(String index, String type, BoolQueryBuilder builder, GeoDistanceSortBuilder sort) {
try {
List<Map<String, Object>> list = new ArrayList<>();
SearchRequestBuilder srb = client.prepareSearch(index).setSize(900000);
if (type != null && type.length() != 0){
srb.setTypes(type);
}
String falg="";
if (sort != null && !StringUtils.isEmpty(sort)) {
srb.addSort(sort);
//用于区分 要距离排序还要时间
falg="1";
}
srb.setQuery(builder);
SearchResponse searchResponse = srb.execute().actionGet();
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits) {
Map<String, Object> map = hit.getSourceAsMap();
if (falg.equals("1")){
BigDecimal geoDis = new BigDecimal((Double) hit.getSortValues()[0]);
map.put("距离",geoDis.setScale(4, BigDecimal.ROUND_HALF_DOWN)+"km");
}
list.add(map);
logger.info("hits:" + map);
}
return list;
} catch (Exception e) {
logger.error("error!", e);
}
return null;
}
} }
package com.founder.eszy.esSearch;
import org.springframework.stereotype.Service;
/**
* Created by chent on 2021-3-9
*/
@Service
public class EsTbZyKkxxTranslationQuery extends EsTranslationQuery{
}
package com.founder.eszy.esSearch;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.geo.GeoPoint;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.GeoPolygonQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.GeoDistanceSortBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created by chent on 2021-3-9
*/
@Service
public class EsTranslationQuery {
@Autowired
private QueryFactory factory;
@Autowired
private Client client;
private static Logger logger = LoggerFactory.getLogger(EsTranslationQuery.class);
/**
* 查找位于多边形中的位置
* @param index 索引
* @param type 类型
* @param field 索引字段
* @param points 构成多边形的点
*/
public List<Map<String, Object>> searchGeoPolygon(String index, String type, String field, List<GeoPoint> points) throws Exception {
GeoPolygonQueryBuilder qb = factory.builtPolygonQuery(field, points);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.filter(qb);
return searchQuery(index, type, boolQueryBuilder,null);
}
/**
* 查询距离中心点指定的范围内的位置
* @param index index
* @param type type
* @param field 索引字段
* @param distance 距离
* @param point 中心点
* @return
* @throws Exception
*/
public List<Map<String, Object>> searchGeoDistance(String index, String type, String field, String distance, GeoPoint point) throws Exception {
Map<String, Object> map = factory.builtDistanceQuery(field, distance, point);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
QueryBuilder qb = (QueryBuilder) map.get("qb");
//按距离排序
GeoDistanceSortBuilder sort = (GeoDistanceSortBuilder) map.get("sort");
boolQueryBuilder.filter(qb);
return searchQuery(index, type, boolQueryBuilder,sort);
}
/**
* 基础查询
* @param index 索引
* @param type type
* @return List<Map>
*/
public List<Map<String, Object>> searchQuery(String index, String type, BoolQueryBuilder boolQueryBuilder, GeoDistanceSortBuilder sort) {
//基础查询不带空间检索
if(boolQueryBuilder==null&& StringUtils.isEmpty(boolQueryBuilder)) {
BoolQueryBuilder bq = QueryBuilders.boolQuery();
return search(index, type, bq, sort);
}else{
//基础查询带空间检索
return search(index, type, boolQueryBuilder, sort);
}
}
/**
* 执行查询
* @param index 索引
* @param type type
* @param builder 查询语句
* @return List<Map>
*/
private List<Map<String, Object>> search(String index, String type, BoolQueryBuilder builder, GeoDistanceSortBuilder sort) {
try {
List<Map<String, Object>> list = new ArrayList<>();
SearchRequestBuilder srb = client.prepareSearch(index).setSize(900000);
if (type != null && type.length() != 0){
srb.setTypes(type);
}
String falg="";
if (sort != null && !StringUtils.isEmpty(sort)) {
srb.addSort(sort);
//用于区分 要距离排序还要时间
falg="1";
}
srb.setQuery(builder);
SearchResponse searchResponse = srb.execute().actionGet();
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits) {
Map<String, Object> map = hit.getSourceAsMap();
if (falg.equals("1")){
BigDecimal geoDis = new BigDecimal((Double) hit.getSortValues()[0]);
map.put("距离",geoDis.setScale(4, BigDecimal.ROUND_HALF_DOWN)+"km");
}
list.add(map);
logger.info("hits:" + map);
}
return list;
} catch (Exception e) {
logger.error("error!", e);
}
return null;
}
}
package com.founder.eszy.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.founder.commonutils.esEntity.TbZyKkxx;
import com.founder.commonutils.publicEntity.Receiving;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author chent
* @since 2021-03-10
*/
@Mapper
public interface TbZyKkxxMapper extends BaseMapper<TbZyKkxx> {
List<TbZyKkxx> selectTbZyKkxxList(Receiving receiving);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.founder.eszy.mapper.TbZyKkxxMapper">
<select id="selectTbZyKkxxList" parameterType="com.founder.commonutils.publicEntity.Receiving" resultType="com.founder.commonutils.esEntity.TbZyKkxx">
select t2.* from(
select t1.*,rownum as rn from
(
SELECT *
FROM tb_zy_kkxx WHERE
x is not null and y is not null
) t1
<where>
rownum<![CDATA[ <= ]]> #{ end , jdbcType=VARCHAR }
</where>
)t2
<where>
rn<![CDATA[ >= ]]> #{ begin, jdbcType=VARCHAR }
</where>
</select>
</mapper>
\ No newline at end of file
...@@ -133,7 +133,7 @@ ...@@ -133,7 +133,7 @@
<!--开发环境:打印控制台--> <!--开发环境:打印控制台-->
<springProfile name="dev"> <springProfile name="dev">
<!--可以输出项目中的debug日志,包括mybatis的sql日志--> <!--可以输出项目中的debug日志,包括mybatis的sql日志-->
<logger name="com.guli" level="INFO" /> <logger name="com.founder" level="INFO" />
<!-- <!--
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
......
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="C:/guli_1010/demo" />
<!-- 彩色日志 -->
<!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 -->
<!-- magenta:洋红 -->
<!-- boldMagenta:粗红-->
<!-- cyan:青色 -->
<!-- white:白色 -->
<!-- magenta:洋红 -->
<property name="CONSOLE_LOG_PATTERN"
value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<!-- 例如:如果此处配置了INFO级别,则后面其他位置即使配置了DEBUG级别的日志,也不会被输出 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--输出到文件-->
<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_info.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 WARN 日志 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_warn.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--
<logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
<logger>仅有一个name属性,
一个可选的level和一个可选的addtivity属性。
name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
如果未设置此属性,那么当前logger将会继承上级的级别。
-->
<!--
使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
第二种就是单独给mapper下目录配置DEBUG模式,代码如下,这样配置sql语句会打印,其他还是正常DEBUG级别:
-->
<!--开发环境:打印控制台-->
<springProfile name="dev">
<!--可以输出项目中的debug日志,包括mybatis的sql日志-->
<logger name="com.founder" level="INFO" />
<!--
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG
可以包含零个或多个appender元素。
-->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</springProfile>
<!--生产环境:输出到文件-->
<springProfile name="pro">
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="WARN_FILE" />
</root>
</springProfile>
</configuration>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment