省厅位置汇聚ES查询修改优化

stwzhj
luyya 2025-08-25 09:47:46 +08:00
parent 769bcc6d9f
commit 87882579c7
5 changed files with 67 additions and 62 deletions

View File

@ -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();

View File

@ -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);

View File

@ -9,6 +9,8 @@ public class SpatialQueryRequest {
private QueryType queryType;
private String index;
// 点查询参数
private Point center;
private Double radius;

View File

@ -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);
}

View File

@ -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;
}