diff --git a/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/controller/ElasticSearchController.java b/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/controller/ElasticSearchController.java index 24893644..a0869858 100644 --- a/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/controller/ElasticSearchController.java +++ b/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/controller/ElasticSearchController.java @@ -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(); diff --git a/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/controller/LocationController.java b/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/controller/LocationController.java index c55dbf3f..41ba29ad 100644 --- a/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/controller/LocationController.java +++ b/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/controller/LocationController.java @@ -40,21 +40,36 @@ public class LocationController { * */ @PostMapping("/getAllLocation") public R getAllLocaltion(@RequestBody Map params){ + List 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 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 tlist = RedisUtils.searchAndGetKeysValues(tkey); + list.addAll(tlist); + } + }else { + for (String s : types) { + String tkey = keys + "*:" + s+":*"; + logger.info("keys={}",tkey); + List 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 list = RedisUtils.searchAndGetKeysValues(key); list.removeAll(Collections.singleton(null)); dlist.addAll(list); diff --git a/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/domain/SpatialQueryRequest.java b/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/domain/SpatialQueryRequest.java index d502b277..3b4349da 100644 --- a/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/domain/SpatialQueryRequest.java +++ b/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/domain/SpatialQueryRequest.java @@ -9,6 +9,8 @@ public class SpatialQueryRequest { private QueryType queryType; + private String index; + // 点查询参数 private Point center; private Double radius; diff --git a/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/service/impl/CorrectGeoQueryService.java b/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/service/impl/CorrectGeoQueryService.java index 6a1b24e2..3f888663 100644 --- a/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/service/impl/CorrectGeoQueryService.java +++ b/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/service/impl/CorrectGeoQueryService.java @@ -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); } diff --git a/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/service/impl/SearchServiceImpl.java b/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/service/impl/SearchServiceImpl.java index 5103007b..32d38951 100644 --- a/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/service/impl/SearchServiceImpl.java +++ b/stwzhj-modules/stwzhj-location/src/main/java/org/dromara/location/service/impl/SearchServiceImpl.java @@ -54,62 +54,51 @@ public class SearchServiceImpl implements ISearchService { public List searchCar(String deviceCode, String startTime, String endTime,String deviceType) throws RuntimeException{ List sourceList = new ArrayList(); List 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; }