省厅位置汇聚ES查询修改优化
parent
769bcc6d9f
commit
87882579c7
|
|
@ -45,6 +45,7 @@ public class ElasticSearchController extends BaseController {
|
|||
try {
|
||||
gpsInfoEntities = searchService.searchCar(deviceCode, startTime, endTime,deviceType);
|
||||
}catch (RuntimeException e){
|
||||
e.printStackTrace();
|
||||
return R.fail(500,e.getMessage());
|
||||
}
|
||||
return R.ok(gpsInfoEntities);
|
||||
|
|
@ -55,7 +56,7 @@ public class ElasticSearchController extends BaseController {
|
|||
* */
|
||||
@PostMapping("/spatial-query")
|
||||
public R spatialQuery(@RequestBody SpatialQueryRequest request) {
|
||||
String todayIndexName = "rs_gpsinfo"+ LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
|
||||
String todayIndexName = request.getIndex();
|
||||
try {
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
|
|
|
|||
|
|
@ -40,21 +40,36 @@ public class LocationController {
|
|||
* */
|
||||
@PostMapping("/getAllLocation")
|
||||
public R getAllLocaltion(@RequestBody Map<String,Object> params){
|
||||
List<JSONObject> list = new ArrayList<>();
|
||||
String keys = "online_users:";
|
||||
String key = null; // 在不同条件下赋值 最后根据此key取值
|
||||
String key = ""; // 在不同条件下赋值 最后根据此key取值
|
||||
if(CollectionUtils.isEmpty(params)){
|
||||
key = keys +"*";
|
||||
list = RedisUtils.searchAndGetKeysValues(key);
|
||||
}
|
||||
List<JSONObject> list = new ArrayList<>();
|
||||
|
||||
if (null != params.get("type")){
|
||||
String type = params.get("type").toString();
|
||||
key = keys + "*:[" +type+"]:*";
|
||||
String[] types = type.split(",");
|
||||
if (null != params.get("deptId")){
|
||||
key = keys + params.get("deptId").toString() + "*:["+type+"]:*"; // key值为 online_users:2022-04-20:3401*:[01,02]:*
|
||||
key = keys + params.get("deptId").toString() + "*:"; // key值为 online_users:2022-04-20:3401*:[01,02]:*
|
||||
for (String s : types) {
|
||||
String tkey = key + s+":*";
|
||||
logger.info("keys={}",tkey);
|
||||
List<JSONObject> tlist = RedisUtils.searchAndGetKeysValues(tkey);
|
||||
list.addAll(tlist);
|
||||
}
|
||||
}else {
|
||||
for (String s : types) {
|
||||
String tkey = keys + "*:" + s+":*";
|
||||
logger.info("keys={}",tkey);
|
||||
List<JSONObject> tlist = RedisUtils.searchAndGetKeysValues(tkey);
|
||||
list.addAll(tlist);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
list = RedisUtils.searchAndGetKeysValues(key);
|
||||
|
||||
list.removeAll(Collections.singleton(null));
|
||||
return R.ok(list);
|
||||
}
|
||||
|
|
@ -74,7 +89,7 @@ public class LocationController {
|
|||
String[] zzjgdm = Convert.toStrArray(zzjgdms);
|
||||
for (String s : zzjgdm) {
|
||||
s = deptIdSub(s);
|
||||
String key = keys + s + ":["+type+"]:*"; // key值为 online_users:3401xxxx:[01,02]:*
|
||||
String key = keys + s + ":"+type+":*"; // key值为 online_users:3401xxxx:[01,02]:*
|
||||
List<JSONObject> list = RedisUtils.searchAndGetKeysValues(key);
|
||||
list.removeAll(Collections.singleton(null));
|
||||
dlist.addAll(list);
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@ public class SpatialQueryRequest {
|
|||
|
||||
private QueryType queryType;
|
||||
|
||||
private String index;
|
||||
|
||||
// 点查询参数
|
||||
private Point center;
|
||||
private Double radius;
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ public class CorrectGeoQueryService {
|
|||
// 创建ES形状
|
||||
ShapeBuilder shapeBuilder = convertGeometryToEsShape(buffer);
|
||||
|
||||
return QueryBuilders.geoShapeQuery("location_shape", shapeBuilder)
|
||||
return QueryBuilders.geoShapeQuery("location", shapeBuilder)
|
||||
.relation(ShapeRelation.INTERSECTS);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -54,62 +54,51 @@ public class SearchServiceImpl implements ISearchService {
|
|||
public List<Map> searchCar(String deviceCode, String startTime, String endTime,String deviceType) throws RuntimeException{
|
||||
List<Map> sourceList = new ArrayList<Map>();
|
||||
List<String> esIndexByTime = findEsIndexByTime(startTime, endTime);
|
||||
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
|
||||
DateTime startDate = DateUtil.parse(startTime, "yyyy-MM-dd HH:mm:ss");
|
||||
DateTime endDate = DateUtil.parse(endTime, "yyyy-MM-dd HH:mm:ss");
|
||||
log.info("查询使用的索引列表: {}", esIndexByTime); // 添加日志输出
|
||||
|
||||
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
|
||||
// 匹配第一个
|
||||
TermQueryBuilder termTerminalBuilder1 = QueryBuilders.termQuery("deviceCode", deviceCode);
|
||||
// 匹配第二个
|
||||
TermQueryBuilder termTerminalBuilder2 = QueryBuilders.termQuery("deviceType", deviceType);
|
||||
|
||||
boolBuilder.must(termTerminalBuilder1);
|
||||
|
||||
boolBuilder.must(termTerminalBuilder2);
|
||||
System.out.print(format.format(startDate));
|
||||
boolBuilder.must(QueryBuilders.rangeQuery("gpsTime")
|
||||
.gte(format.format(startDate))
|
||||
.lte(format.format(endDate)) );
|
||||
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery()
|
||||
.must(QueryBuilders.termQuery("deviceCode", deviceCode))
|
||||
.must(QueryBuilders.termQuery("deviceType", deviceType))
|
||||
.must(QueryBuilders.rangeQuery("gpsTime")
|
||||
.format("yyyy-MM-dd HH:mm:ss")
|
||||
.gte(startTime)
|
||||
.lte(endTime));
|
||||
log.info("查询条件: deviceCode={}, deviceType={}, start={}, end={}",
|
||||
deviceCode, deviceType, startTime, endTime);
|
||||
|
||||
// 执行滚动查询
|
||||
Scroll scroll = new Scroll(TimeValue.timeValueMinutes(1L));
|
||||
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
|
||||
sourceBuilder.query(boolBuilder).sort("gpsTime",SortOrder.ASC).size(5000);
|
||||
SearchRequest rq = new SearchRequest();
|
||||
// boolBuilder.withIndicesOptions(IndicesOptions.lenientExpandOpen());
|
||||
rq.scroll(scroll);
|
||||
rq.source(sourceBuilder);
|
||||
rq.indices(esIndexByTime.toArray(new String[0]));
|
||||
// 忽略因索引不存在导致的错误
|
||||
rq.indicesOptions(IndicesOptions.lenientExpandOpen());
|
||||
// SearchResponse rp = null;
|
||||
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
|
||||
.query(boolBuilder)
|
||||
.sort("gpsTime", SortOrder.ASC)
|
||||
.size(5000);
|
||||
|
||||
SearchRequest rq = new SearchRequest()
|
||||
.indices(esIndexByTime.toArray(new String[0]))
|
||||
.source(sourceBuilder)
|
||||
.scroll(scroll)
|
||||
.indicesOptions(IndicesOptions.lenientExpandOpen());
|
||||
// 添加到构建查询后
|
||||
String dsl = sourceBuilder.toString();
|
||||
log.info("最终DSL查询语句:\n{}", dsl);
|
||||
try {
|
||||
SearchResponse rp = restHighLevelClient.search(rq,RequestOptions.DEFAULT);
|
||||
SearchHit[] searchHits = rp.getHits().getHits();
|
||||
for (SearchHit searchHit : searchHits) {
|
||||
Map sourceAsMap = searchHit.getSourceAsMap();
|
||||
sourceList.add(sourceAsMap);
|
||||
SearchResponse rp = restHighLevelClient.search(rq, RequestOptions.DEFAULT);
|
||||
log.info("ES返回总命中数: {}", rp.getHits().getTotalHits()); // 关键日志
|
||||
|
||||
String scrollId = rp.getScrollId();
|
||||
SearchHit[] hits = rp.getHits().getHits();
|
||||
while (hits != null && hits.length > 0) {
|
||||
for (SearchHit hit : hits) {
|
||||
sourceList.add(hit.getSourceAsMap());
|
||||
}
|
||||
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId)
|
||||
.scroll(scroll);
|
||||
rp = restHighLevelClient.scroll(scrollRequest, RequestOptions.DEFAULT);
|
||||
hits = rp.getHits().getHits();
|
||||
scrollId = rp.getScrollId(); // 更新scrollId
|
||||
}
|
||||
|
||||
//遍历搜索命中的数据,直到没有数据
|
||||
String scrollId = rp.getScrollId();
|
||||
while (searchHits != null && searchHits.length > 0) {
|
||||
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
|
||||
scrollRequest.scroll(scroll);
|
||||
try {
|
||||
rp = restHighLevelClient.scroll(scrollRequest,RequestOptions.DEFAULT);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
scrollId = rp.getScrollId();
|
||||
searchHits = rp.getHits().getHits();
|
||||
if (searchHits != null && searchHits.length > 0) {
|
||||
for (SearchHit searchHit : searchHits) {
|
||||
Map sourceAsMap = searchHit.getSourceAsMap();
|
||||
sourceList.add(sourceAsMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 清理滚动
|
||||
//清除滚屏
|
||||
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
|
||||
clearScrollRequest.addScrollId(scrollId);//也可以选择setScrollIds()将多个scrollId一起使用
|
||||
|
|
@ -120,11 +109,9 @@ public class SearchServiceImpl implements ISearchService {
|
|||
e.printStackTrace();
|
||||
}
|
||||
boolean succeeded = clearScrollResponse.isSucceeded();
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
log.error("ES查询异常", e);
|
||||
}
|
||||
|
||||
return sourceList;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue