es开启数据压缩,es增加游标,searchAfter,范围查询方法

This commit is contained in:
liuzhaotian
2025-05-09 15:21:45 +08:00
parent 8d544d10d0
commit 6cecff9e26
6 changed files with 324 additions and 196 deletions
@@ -10,16 +10,15 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.Data;
import lombok.SneakyThrows;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.*;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
@@ -271,181 +270,4 @@ public class JsonUtils {
}
/*
* */
public static List<List<Object>> jsonTo2DArray(String jsonString) {
try {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonArray = objectMapper.readTree(jsonString);
Set<String> headers = new LinkedHashSet<>();
List<List<Object>> result = new ArrayList<>();
// 从数组中的所有对象收集标头
if (jsonArray.isArray()) {
for (JsonNode jsonObject : jsonArray) {
Iterator<String> fieldNames = jsonObject.fieldNames();
while (fieldNames.hasNext()) {
headers.add(fieldNames.next());
}
}
}
result.add(new ArrayList<>(headers));
// 提取行
for (JsonNode jsonObject : jsonArray) {
List<Object> row = new ArrayList<>();
for (String header : headers) {
getRow(jsonObject, header, row);
}
result.add(row);
}
return result;
} catch (Exception e) {
e.printStackTrace();
return new ArrayList<>();
}
}
/**
* 提取行
*
* @param jsonObject
* @param header
* @param row
* @return
*/
private static void getRow(JsonNode jsonObject, String header, List<Object> row) {
JsonNode valueNode = jsonObject.get(header);
if (valueNode != null) {
if (valueNode.isTextual()) {
row.add(valueNode.asText());
} else if (valueNode.isInt()) {
row.add(valueNode.asInt());
} else if (valueNode.isBoolean()) {
row.add(valueNode.asBoolean());
} else if (valueNode.isDouble()) {
row.add(valueNode.asDouble());
} else if (valueNode.isArray() || valueNode.isObject()) {
row.add(jsonTo2DArray(valueNode.toString()));
} else {
row.add(valueNode.asText());
}
} else {
row.add(null); // 处理缺少的值
}
}
// 抽取 json数据,不改变数据结构对应的值,只改变数据结构(参考 HPACK 算法) 实现json数据抽取
public static List<List<Object>> getData(Object object) {
String jsonString = toJsonString(object);
ObjectMapper mapper = new ObjectMapper();
try {
List<Map<String, Object>> list = mapper.readValue(jsonString, new TypeReference<>() {});
List<List<Object>> result = convertTo2DArray(list);
//
return result;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private static List<List<Object>> convertTo2DArray(List<Map<String, Object>> list) {
List<List<Object>> result = new ArrayList<>();
// Get the headers from the first map
if (list.size() > 0) {
Map<String, Object> firstMap = list.get(0);
List<Object> headers = new ArrayList<>(firstMap.keySet());
result.add(headers);
//
// Add rows
for (Map<String, Object> map : list) {
//
List<Object> row = new ArrayList<>();
for (Object header : headers) {
row.add(map.get(header));
}
result.add(row);
}
}
return result;
}
// 将所有抽取后的 json 数据都加入一个统一的数据类型中,方便前端解析哪些代码是抽取的数据,进行数据还原
@Data
@ToString(callSuper = true)
public static class ExtractedData {
List<List<Object>> extractedData;
}
public static List<List<List<Object>>> fetchData(Object obj) {
List<List<List<Object>>> data = new ArrayList<>();
try {
// 获取所有字段
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
// 跳过静态或常量字段
if (java.lang.reflect.Modifier.isStatic(field.getModifiers()) ||
java.lang.reflect.Modifier.isFinal(field.getModifiers())) {
continue;
}
// 确保字段是可访问的
field.setAccessible(true);
// 获取字段值
Object fieldValue = field.get(obj);
// 如果字段值是一个对象,递归调用 fetchData
if (fieldValue != null && isCustomObject(fieldValue)) {
data.add(JsonUtils.jsonTo2DArray(toJsonString(fieldValue)));
fetchData(fieldValue);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
// 判断一个对象是否是自定义的类对象
private static boolean isCustomObject(Object obj) {
Class<?> clazz = obj.getClass();
// 自定义对象通常不会是 Java 的基本类型或标准库类型
// 这里可以根据具体需求进行更加复杂的判断
return !clazz.isPrimitive() &&
!clazz.getName().startsWith("java.") &&
!clazz.getName().startsWith("javax.") &&
!clazz.getName().startsWith("sun.") &&
!clazz.isAssignableFrom(Collection.class) &&
!clazz.isAssignableFrom(Map.class);
}
}