import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.ClearScrollRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequest;
import org.elasticsearch.action.support.WriteRequest;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.core.CountRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.Scroll;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import java.io.IOException;
import java.util.*;
public class EsUtils {
/**
* 查询全部
* */
public static SearchResponse queryAll(RestHighLevelClient client,String indices,int page,int size) throws IOException {
SearchRequest request = new SearchRequest().indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery());
if (page <= 0 ) page=1;
if ( size < 0 ) size=0;
sourceBuilder.from((page-1)*size);
sourceBuilder.size(size);
request.source(sourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}
/**
* 查询单条数据是否存在
* */
public static boolean exists(RestHighLevelClient client, String indices, GetRequest getRequest) throws IOException {
return client.exists(getRequest, RequestOptions.DEFAULT);
}
/**
* 查询满足条件的数据总条数
* */
public static long queryCount(RestHighLevelClient client,QueryBuilder queryBuilder,String indices) throws IOException {
long count =0;
CountRequest countRequest = new CountRequest();
countRequest.query(queryBuilder);
countRequest.indices(indices);
count=client.count(countRequest, RequestOptions.DEFAULT).getCount();
return count;
}
/**
* 查询满足条件的数据总条数
* */
public static long allCount(RestHighLevelClient client,String indices) throws IOException {
CountRequest countRequest = new CountRequest();
countRequest.query(QueryBuilders.matchAllQuery());
countRequest.indices(indices);
return client.count(countRequest, RequestOptions.DEFAULT).getCount();
}
/**
* 条件查询
* */
public static SearchResponse query(RestHighLevelClient client,String indices, SearchSourceBuilder sourceBuilder) throws IOException {
SearchRequest request = new SearchRequest().indices(indices);
request.source(sourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}
/**
* 条件查询 - 指定排序字段
* */
public static SearchResponse query(RestHighLevelClient client,String indices, QueryBuilder queryBuilder, int page, int size, String sort) throws IOException {
SearchRequest request = new SearchRequest().indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if (page <= 0 ) page=1;
if ( size < 0 ) size=0;
sourceBuilder.from((page - 1) * size);
sourceBuilder.size(size);
if (StringUtils.isNotBlank(sort)) {
sourceBuilder.sort(sort, SortOrder.DESC);
}
sourceBuilder.query(queryBuilder);
request.source(sourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}
/**
* 条件查询 - 指定分页
* */
public static SearchResponse query(RestHighLevelClient client,String indices, QueryBuilder queryBuilder, int page, int size) throws IOException {
SearchRequest request = new SearchRequest().indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if (page <= 0 ) page=1;
if ( size < 0 ) size=0;
sourceBuilder.from((page - 1) * size);
sourceBuilder.size(size);
sourceBuilder.query(queryBuilder);
request.source(sourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}
/**
* 条件查询- 配置排除/返回指定字段
* */
public static SearchResponse query(RestHighLevelClient client,String indices, QueryBuilder queryBuilder, String[] excludes,String[] includes,int page, int size) throws IOException {
SearchRequest request = new SearchRequest().indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if (page <= 0 ) page=1;
if ( size < 0 ) size=0;
sourceBuilder.from((page - 1) * size);
sourceBuilder.size(size);
sourceBuilder.query(queryBuilder);
sourceBuilder.fetchSource(includes,excludes);
request.source(sourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}
/**
* 条件查询- 配置排除/返回指定字段
* */
public static SearchResponse query(RestHighLevelClient client,String indices, QueryBuilder queryBuilder, String exclude,String include,int page, int size) throws IOException {
SearchRequest request = new SearchRequest().indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if (page <= 0 ) page=1;
if ( size < 0 ) size=0;
sourceBuilder.from((page - 1) * size);
sourceBuilder.size(size);
sourceBuilder.query(queryBuilder);
sourceBuilder.fetchSource(new String[]{include},new String[]{exclude});
request.source(sourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}
/**
* 条件查询- 配置排除指定字段带分页
* */
public static SearchResponse queryExcludeField(RestHighLevelClient client,String indices, QueryBuilder queryBuilder, String[] excludes,int page, int size) throws IOException {
SearchRequest request = new SearchRequest().indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if (page <= 0 ) page=1;
if ( size < 0 ) size=0;
sourceBuilder.from((page - 1) * size);
sourceBuilder.size(size);
sourceBuilder.query(queryBuilder);
sourceBuilder.fetchSource(new String[]{""},excludes);
request.source(sourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}
/**
* 条件查询- 配置排除指定字段
* */
public static SearchResponse queryExcludeField(RestHighLevelClient client,String indices, QueryBuilder queryBuilder, String... excludes) throws IOException {
SearchRequest request = new SearchRequest().indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(queryBuilder);
sourceBuilder.fetchSource(new String[]{""},excludes);
request.source(sourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}
/**
* 条件查询- 配置返回指定字段带分页
* */
public static SearchResponse queryIncludeField(RestHighLevelClient client,String indices, QueryBuilder queryBuilder, String[] includes,int page, int size) throws IOException {
SearchRequest request = new SearchRequest().indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if (page <= 0 ) page=1;
if ( size < 0 ) size=0;
sourceBuilder.from((page - 1) * size);
sourceBuilder.size(size);
sourceBuilder.query(queryBuilder);
sourceBuilder.fetchSource(includes,new String[]{""});
request.source(sourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}
/**
* 条件查询- 配置返回指定字段
* */
public static SearchResponse queryIncludeField(RestHighLevelClient client,String indices, QueryBuilder queryBuilder, String... includes) throws IOException {
SearchRequest request = new SearchRequest().indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(queryBuilder);
sourceBuilder.fetchSource(includes,new String[]{""});
request.source(sourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}
/**
* 查询满足条件的数据并设置排序规则。
* */
public static SearchResponse queryAndSort(RestHighLevelClient client,String indices, QueryBuilder queryBuilder, int page, int size, String sort, SortOrder order) throws IOException {
SearchRequest request = new SearchRequest().indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if (page <= 0 ) page=1;
if ( size < 0 ) size=0;
sourceBuilder.from((page - 1) * size);
sourceBuilder.size(size);
sourceBuilder.sort(sort, order);
sourceBuilder.query(queryBuilder);
request.source(sourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}
/**
* 自定义聚合查询
* */
public static SearchResponse aggQuery(RestHighLevelClient client, String indices, QueryBuilder queryBuilder, AggregationBuilder aggregationBuilder) throws IOException {
SearchRequest request = new SearchRequest().indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.size(0);
sourceBuilder.query(queryBuilder);
sourceBuilder.aggregation(aggregationBuilder);
request.source(sourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}
/**
* 单字段聚合查询
* */
public static Map<String, Long> aggOneArgs(RestHighLevelClient client,String indices, QueryBuilder queryBuilder, String args1, int size) throws IOException {
Map<String, Long> map = null;
map = new HashMap<>();
SearchRequest request = new SearchRequest().indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.size(0);
sourceBuilder.query(queryBuilder);
TermsAggregationBuilder agg1 = AggregationBuilders.terms(args1).field(args1 + ".keyword").size(size);
sourceBuilder.aggregation(agg1);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
Terms terms = response.getAggregations().get(args1);
for (Terms.Bucket bucket : terms.getBuckets()) {
map.put(bucket.getKeyAsString(), bucket.getDocCount());
}
return map;
}
/**
* 两个字段聚合查询
* */
public static Map<String, Map<String, Long>> aggTwoArgs(RestHighLevelClient client,String indices, QueryBuilder queryBuilder, String args1, String args2, int size) throws IOException {
Map<String, Map<String, Long>> map = null;
map = new HashMap<>();
SearchRequest request = new SearchRequest().indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.size(0);
sourceBuilder.query(queryBuilder);
TermsAggregationBuilder agg1 = AggregationBuilders.terms(args1).field(args1 + ".keyword").size(size);
TermsAggregationBuilder agg2 = AggregationBuilders.terms(args2).field(args2 + ".keyword").size(size);
agg1.subAggregation(agg2);
sourceBuilder.aggregation(agg1);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
Aggregations aggregations = response.getAggregations();
Terms terms1 = aggregations.get(args1);
for (Terms.Bucket bucket1 : terms1.getBuckets()) {
Terms terms2 = bucket1.getAggregations().get(args2);
Map<String, Long> map1 = new HashMap<>();
for (Terms.Bucket bucket2 : terms2.getBuckets()) {
map1.put(bucket2.getKeyAsString(), bucket2.getDocCount());
}
map.put(bucket1.getKeyAsString(), map1);
}
return map;
}
/**
* 滚动查询带条件
**/
public static Map<String,Object> scrollQuery(RestHighLevelClient client,String indices,QueryBuilder queryBuilder,String[] excludes,String[] includes,int num) throws IOException {
ArrayList<String> strings = new ArrayList<>();
HashMap<String, Object> dataMap = new HashMap<>();
SearchRequest searchRequest = new SearchRequest(indices);
Scroll scroll = new Scroll(TimeValue.timeValueMinutes(5L));
searchRequest.scroll(scroll);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(queryBuilder);
searchSourceBuilder.size(num);
if (null == includes) includes = new String[]{""};
if (null == excludes) excludes = new String[]{""};
searchSourceBuilder.fetchSource(includes,excludes);
searchRequest.source(searchSourceBuilder);
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
String scrollId = response.getScrollId();
SearchHit[] hits = response.getInternalResponse().hits().getHits();
for (SearchHit searchHit : hits) {
strings.add(searchHit.getSourceAsString());
}
dataMap.put("scroll",scrollId);
dataMap.put("data",strings);
return dataMap;
}
/**
* 请求上免得scrollQuery或者scrollQueryAll方法后,之后的每次查询都请求这个scrollQuery方法
* */
public static List<String> scrollQuery(RestHighLevelClient client, String scrollId) throws IOException {
ArrayList<String> strings = new ArrayList<>();
Scroll scroll = new Scroll(TimeValue.timeValueMinutes(5L));
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(scroll);
SearchResponse response = client.scroll(scrollRequest, RequestOptions.DEFAULT);
SearchHit[] hits = response.getHits().getHits();
for (SearchHit searchHit : hits) {
strings.add(searchHit.getSourceAsString());
}
return strings;
}
/**
* 清除scroll_id
* */
public static boolean clearScrollIds(RestHighLevelClient client,String... scrollIds){
List<String> sIds = new ArrayList<>();
for (String scrollId : scrollIds) {
sIds.add(scrollId);
}
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
//添加单个id
clearScrollRequest.addScrollId("滚动id");
//添加多个id
clearScrollRequest.setScrollIds(sIds);
try {
client.clearScroll(clearScrollRequest,RequestOptions.DEFAULT);
return true;
} catch (IOException e) {
return false;
}
}
/**
* search after查询
* @return
* 返回值中key为 data的数据,value是 ArrayList<String>类型
* 返回值中key为 sort_id的数据,value是 Object[] 类型
* */
public static Map<String,Object> searchAfterQuery(RestHighLevelClient client,String indices,SearchSourceBuilder searchSourceBuilder) throws IOException {
HashMap<String, Object> hashMap = new HashMap<>();
ArrayList<String> data = new ArrayList<>();
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(indices);
searchRequest.source(searchSourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = search.getHits().getHits();
Object[] sortValues=new Object[0];
if (hits.length>0){
sortValues = hits[hits.length - 1].getSortValues();
}
for (SearchHit hit : hits) {
data.add(hit.getSourceAsString());
}
hashMap.put("data",data);
hashMap.put("sortId",sortValues);
return hashMap;
}
/**
* search after查询
* @return
* 返回值中key为 data的数据,value是 ArrayList<String>类型
* 返回值中key为 sort_id的数据,value是 Object[] 类型
* */
public static Map<String,Object> searchAfterQuery(RestHighLevelClient client,SearchRequest searchRequest) throws IOException {
HashMap<String, Object> hashMap = new HashMap<>();
ArrayList<String> data = new ArrayList<>();
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = search.getHits().getHits();
Object[] sortValues=new Object[0];
if (hits.length>0){
sortValues = hits[hits.length - 1].getSortValues();
}
for (SearchHit hit : hits) {
data.add(hit.getSourceAsString());
}
hashMap.put("data",data);
hashMap.put("sortId",sortValues);
return hashMap;
}
/**
* search after查询
* @return
* 返回值中key为 data的数据,value是 ArrayList<String>类型
* 返回值中key为 sort_id的数据,value是 Object[] 类型
* */
public static Map<String,Object> searchAfterQuery(RestHighLevelClient client,String indices,QueryBuilder queryBuilder,int size,String sort,SortOrder order) throws IOException {
HashMap<String, Object> hashMap = new HashMap<>();
ArrayList<String> data = new ArrayList<>();
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(indices);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.from(0).size(size).sort(sort,order).query(queryBuilder);
searchRequest.source(sourceBuilder);
sourceBuilder.trackTotalHits(true);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = search.getHits().getHits();
Object[] sortValues=new Object[0];
if (hits.length>0){
sortValues = hits[hits.length - 1].getSortValues();
}
for (SearchHit hit : hits) {
data.add(hit.getSourceAsString());
}
hashMap.put("data",data);
hashMap.put("sortId",sortValues);
return hashMap;
}
/**
* 插入数据。json格式。
* */
public static void insertData(RestHighLevelClient client,String indices,String id,String data) throws IOException {
IndexRequest indexRequest = new IndexRequest();
indexRequest.index(indices).id(id).source(data, XContentType.JSON);
client.index(indexRequest,RequestOptions.DEFAULT);
}
/**
* 删除指定索引
* */
public static boolean deleteIndex(RestHighLevelClient client,String indices) throws IOException {
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indices);
deleteIndexRequest.timeout(TimeValue.timeValueMinutes(2));
AcknowledgedResponse delete = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
return delete.isAcknowledged();
}
}
es工具类(自定义)
于 2022-01-05 16:42:53 首次发布