<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.0.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.0.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>7.0.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
<version>7.0.0</version>
</dependency>
</dependencies>
import org.elasticsearch.action.search.SearchResponse;
import java.util.List;
import java.util.Map;
/**
* @Author: gh
* @Description: elasticsearch查询数据(分页)、添加数据、修改数据、删除数据、展示所有库表、统计每张表的记录总条数;
* es的使用率,已使用的存储空间大小。按任意字段进行模糊查询。获取所有字段的名称。
*/
public interface EsDao {
/**
* 分页查询
* @param index 索引名称
* @param pageSize 页的大小
* @param pageNum 第几页
* @return
*/
public SearchResponse getAllRowsBySearchAfter(String index, Integer pageSize, Integer pageNum);
public SearchResponse getAllRowsByFromSize(String index, Integer pageSize, Integer pageNum);
public List<Map<String, Object>> getAllRowsByScroll(String index);
/**
* 统计每个index下的document总数。
* count API的命令:GET /index_name/type_name/_count
* @param indexes 查询一个或多个index
* @return
*/
public long totalCount(String...indexes);
/**
* 查询某条document是否存在。
* @param index 索引名称
* @param id _id字段对应的主键值。
* @return true存在,false不存在。
*/
public boolean docIsExist(String index,String id);
/**
* 新增一条document。
* @param index 索引名称
* @param kvs 各个字段名称(key)和对应的值(value)
* @return 200/201表示新增成功;其他如400表示新增失败。
*/
public int insertDoc(String index,Map<String, Object> kvs);
/**
* 删除一条document。
* @param index 索引名称
* @param id _id字段对应的主键值。
* @return 200/201表示删除成功;其他如400表示删除失败。
*/
public int deleteDoc(String index,String id);
/**
* 更新一条document
* @param index 索引名称
* @param id _id字段对应的主键值。
* @param kvs 各个字段名称(key)和对应的值(value)
* @return 200/201表示更新成功;其他如400表示更新失败。
*/
public int updateDoc(String index,String id,Map<String, Object> kvs);
/**
* es使用率 = cluster store(size_in_bytes) / (所有节点的磁盘可用空间 + size_in_bytes)
* size_in_bytes: "_all":{"total":{"store":{"size_in_bytes": ***}}}
* 某个节点的磁盘可用空间:(节点状态)"fs":{"total":{"available_in_bytes":***}}
* @return
*/
public double usedRate();
/**
* 获取某个cluster下所有的index名称列表。
* 命令:_cluster/state/routing_table
* @param clusterName 集群名称
* @return
*/
public Map<String, List<String>> getClusterIndexes(String clusterName);
/**
* 获取某个index下所有的type名称列表。
* _type字段从elasticsearch 6.0.0版本开始过时,7.0版本后不再使用。
* @return
*/
public Map<String,List<String>> getIndexTypes(String clusterName);
/**
* @return 全部已使用存储空间的大小
*/
public double storeSizeOfMB();
/**
* @param index 需要查询的索引名称
* @return (某个索引下)已使用存储空间的大小
*/
public double storeSizeOfMB(String index);
/**
* 暂行:1.统计某个集群(相当于数据库)下所有index(相当于表)的数量。默认集群时elasticsearch。
* 搁置:2.统计某个index(相当于数据库)下所有type(相当于表)的数量。
* @return 表的数量
*/
public int countTables();
/**
* 获取某个集群(相当于数据库)下所有的indice(相当于表)的名称列表。
* @return
*/
public List<String> getTablenamesOfDB();
/**
* 按任意字段进行模糊查询
* @param indexName 索引名
* @param fieldName 字段名
* @param fieldValue 字段模糊值
*/
public SearchResponse queryByRandomField(String indexName,String fieldName,String fieldValue,
int pageSize,int pageNum);
/**
* @param indexName 索引名
* @param fieldName 字段名
* @param fieldValue 字段模糊值
* @return 模糊查询时返回的记录总数
*/
public long totalCountOfFuzzyQuery(String indexName,String fieldName,String fieldValue);
/**
* 获取 某个索引的所有字段名
* @param indexName 索引的名称。例如:table1
* @return map<k,v> k:字段名,v:空字符串
*/
public Map<String,Object> getColumnNames(String indexName);
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.genius.pojo.pg.dto.DataBaseDTO;
import com.genius.util.StringUtil;
import com.genius.util.common.FileSizeUtil;
import com.genius.util.common.SizeUnitEnum;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.elasticsearch.action.DocWriteRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.*;
import org.elasticsearch.action.support.WriteRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.*;
import org.elasticsearch.client.core.CountRequest;
import org.elasticsearch.client.core.CountResponse;
import org.elasticsearch.client.indices.*;
import org.elasticsearch.cluster.metadata.MappingMetaData;
import org.elasticsearch.common.document.DocumentField;
import org.elasticsearch.common.geo.builders.CoordinatesBuilder;
import org.elasticsearch.common.geo.builders.GeometryCollectionBuilder;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.*;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.Scroll;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.util.StringUtils;
import java.io.*;
import java.sql.*;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description: 使用es JDBC 方式进行 查询数据(分页)、添加数据、修改数据、删除数据、展示所有库表。
* 【注意】
* 1.Elasticsearch JDBC方式不提供连接池机制;可以使用第三方连接池的机制。
* 2.使用Elasticsearch x-pack-sql-jdbc的包会报错:
* java.sql.SQLInvalidAuthorizationSpecException:
* current license is non-compliant for [jdbc]
* 使用JDBC客户端,elasticsearch需要升级到白金级:https://www.elastic.co/cn/subscriptions
*/
public class EsDaoImpl implements EsDao{
RestHighLevelClient restClient = null;
DataBaseDTO dataBaseDTO = null;
public EsDaoImpl(DataBaseDTO dbd) {
try {
dataBaseDTO = dbd;
this.restClient = connectToES();
//initClient();
} catch (Exception e) {
e.printStackTrace();
}
}
public RestHighLevelClient getRestClient() {
return restClient;
}
public void setRestClient(RestHighLevelClient restClient) {
this.restClient = restClient;
}
/**
* 关闭连接
*/
public void close(){
try{
if(this.restClient != null){
restClient.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
public boolean connected(){
try {
if(getRestClient() != null && getRestClient().ping(RequestOptions.DEFAULT)){
return true;
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* JDBC连接elasticsearch。http port=9200
* jdbc:es://[[http|https]://][host[:port]]/[prefix]<[?[option=value]&]
* e.g. jdbc:es://http://server:3456/?timezone=UTC&page.size=250
* 安全通信:SSL
* @return
* @throws SQLException
*/
/*private Connection connectToES_abandon() throws SQLException {
if(conn == null){
if(dataBaseDTO != null){
String url = "jdbc:es://"+dataBaseDTO.getIp()+":9200";
System.out.println(url);
EsDataSource ds = new EsDataSource();
ds.setUrl(url);
Properties props = new Properties();
*//*props.put("user", "test_admin");
props.put("password", "x-pack-test-password");*//*
ds.setProperties(props);
return ds.getConnection();
//return DriverManager.getConnection(url, props);
}
}
return conn;
}*/
/**
* 连接 elasticsearch 并获取 index信息
* @return
* @throws SQLException
*/
private RestHighLevelClient connectToES() {
try {
String esIP = dataBaseDTO.getIp();
//http port = 9200
String esPort = dataBaseDTO.getHost();
//索引。
//String index = dataBaseDTO.getDbName();
//TODO: 用户名、密码做校验。目前cluster是默认的。
return new RestHighLevelClient(
RestClient.builder(new HttpHost(esIP, Integer.valueOf(esPort), "http")));
//flag = indexIsExist(index);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public SearchResponse getAllRowsByScrollScan(String index, Integer pageSize, Integer pageNum) {
return getAllRowsByScrollScan(null,index,pageSize,pageNum);
}
private SearchResponse getAllRowsByScrollScan(SearchSourceBuilder sourceBuilder,String index,
Integer pageSize,Integer pageNum) {
if(pageSize==null || pageSize<1){