package com.xx.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.gtcom.config.RestClientConfig;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.support.WriteRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.Requests;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.*;
@Slf4j
@Component
public class EsUtils {
@Autowired
@Qualifier(RestClientConfig.ES_CLIENT_1)
private RestHighLevelClient esClient1;
@Autowired
@Qualifier(RestClientConfig.ES_CLIENT_2)
private RestHighLevelClient esClient2;
public boolean updateDataBatch(String indexName, String primaryKeyName, String paramListJson) {
BulkRequest bulkRequest = packBulkUpdateRequest(indexName, primaryKeyName, paramListJson);
if (bulkRequest.requests().isEmpty()) {
return false;
}
bulkRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
try {
BulkResponse bulk = esClient1.bulk(bulkRequest, RequestOptions.DEFAULT);
if (bulk.hasFailures()) {
for (BulkItemResponse item : bulk.getItems()) {
log.error("索引[{}],主键[{}]修改操作失败,状态为:[{}],错误信息:{}", indexName, item.getId(),
item.status(), item.getFailureMessage());
}
return false;
}
Integer createdCount = 0;
Integer updatedCount = 0;
for (BulkItemResponse item : bulk.getItems()) {
if (IndexResponse.Result.CREATED.equals(item.getResponse().getResult())) {
createdCount++;
} else if (IndexResponse.Result.UPDATED.equals(item.getResponse().getResult())) {
updatedCount++;
}
}
log.info("索引[{}]批量修改更新成功,共新增[{}]个,修改[{}]个", indexName, createdCount, updatedCount);
} catch (IOException e) {
log.error("索引[{}]批量修改更新出现异常", indexName);
return false;
}
return true;
}
private BulkRequest packBulkUpdateRequest(String indexName, String primaryKeyName, String paramListJson) {
BulkRequest bulkRequest = new BulkRequest();
JSONArray jsonArray = JSONArray.parseArray(paramListJson);
if (jsonArray == null && jsonArray.size() == 0) {
return bulkRequest;
}
jsonArray.forEach(obj -> {
Map<String, Object> map = (Map<String, Object>) obj;
UpdateRequest updateRequest = new UpdateRequest(indexName, String.valueOf(map.get(primaryKeyName)));
updateRequest.docAsUpsert(true);
updateRequest.doc(JSON.toJSONString(obj), XContentType.JSON);
bulkRequest.add(updateRequest);
});
return bulkRequest;
}
public List queryFilter(String indexName,String flied,String fliedValue) {
List resList= new ArrayList<>();
int pageStart = 0;
int pageSize = 10000;
QueryBuilder boolBuilder = queryBuilder(flied,fliedValue);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder
.query(boolBuilder)
.from(pageStart)
.size(pageSize)
.explain(false);
SearchRequest searchRequest = new SearchRequest(indexName);
searchSourceBuilder.storedFields(new ArrayList<String>() {{
add("dataId");
}});
searchRequest.source(searchSourceBuilder);
searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH);
SearchResponse response = null;
try {
response = esClient1.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
log.debug("共匹配到:" + searchHits.getTotalHits().value + "条记录!");
SearchHit[] hits = searchHits.getHits();
for (SearchHit searchHit : hits) {
Map map= new HashMap<>(5);
String result=searchHit.getSourceAsString();
map.put(searchHit.getIndex(),result);
resList.add(map);
}
} catch (IOException e) {
System.out.println("==============");
}
return resList;
}
private BoolQueryBuilder queryBuilder(String flied,String fliedValue) {
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
QueryBuilder termQueryBuilder = QueryBuilders.termQuery(flied, fliedValue);
BoolQueryBuilder filterQueryBuilder = QueryBuilders.boolQuery().filter(termQueryBuilder);
boolBuilder.must(filterQueryBuilder);
return boolBuilder;
}
public List aggData(String aggFiled) throws IOException {
SearchSourceBuilder query = new SearchSourceBuilder();
TermsAggregationBuilder topBuilder=AggregationBuilders.terms("title").field(aggFiled);
topBuilder.size(10000);
query.aggregation(topBuilder);
SearchRequest request = Requests.searchRequest("news_*").
searchType(SearchType.QUERY_THEN_FETCH )
.source(query);
SearchResponse response = esClient1.search(request, RequestOptions.DEFAULT);
List<Map<String, Object>> list = new ArrayList<>();
Aggregations aggregations = response.getAggregations();
List dictList= new ArrayList<>();
if (RestStatus.OK.equals(response.status())) {
Terms byCompanyAggregation = aggregations.get("title");
List<? extends Terms.Bucket> buckets = byCompanyAggregation.getBuckets();
log.info("聚合总量{}", buckets.size());
for (Terms.Bucket bucket : buckets) {
dictList.add(bucket.getKeyAsString());
}
}
return dictList;
}
public List queryMustNot(String indexName,String flied,List fliedValue){
List<Map<String,String>> resList= new ArrayList<>();
int pageStart = 0;
int pageSize = 10000;
QueryBuilder boolBuilder = queryMustNotBuilder(flied,fliedValue);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder
.query(boolBuilder)
.from(pageStart)
.size(pageSize)
.explain(false);
searchSourceBuilder.storedFields(new ArrayList<String>() {{
add("dataId");
}});
SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.source(searchSourceBuilder);
searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH);
SearchResponse response = null;
try {
response = esClient1.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
log.info("共匹配到:" + searchHits.getTotalHits().value + "条记录!");
SearchHit[] hits = searchHits.getHits();
for (SearchHit searchHit : hits) {
Map map= new HashMap<>(5);
String result=searchHit.getSourceAsString();
map.put(searchHit.getIndex(),result);
resList.add(map);
}
} catch (IOException e) {
log.error("es 查询错误{}",e);
}
return resList;
}
private BoolQueryBuilder queryMustNotBuilder(String flied,List<String> fliedValueS) {
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
BoolQueryBuilder exersiceBoolQuery = QueryBuilders.boolQuery();
for (String fliedValue: fliedValueS){
exersiceBoolQuery.mustNot(QueryBuilders.termQuery(flied, fliedValue));
}
return exersiceBoolQuery;
}
public List fliteNullValue(String indexName, String flied){
List resList= new ArrayList<>();
int pageStart = 0;
int pageSize = 10000;
QueryBuilder boolBuilder = queryBuilderIsNull(flied);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder
.query(boolBuilder)
.from(pageStart)
.size(pageSize)
.explain(false);
SearchRequest searchRequest = new SearchRequest(indexName);
searchSourceBuilder.storedFields(new ArrayList<String>() {{
add("dataId");
}});
searchRequest.source(searchSourceBuilder);
searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH);
SearchResponse response = null;
try {
response = esClient1.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
log.info("共匹配到:" + searchHits.getTotalHits().value + "条记录!");
SearchHit[] hits = searchHits.getHits();
for (SearchHit searchHit : hits) {
Map map= new HashMap<>(5);
String result=searchHit.getSourceAsString();
map.put(searchHit.getIndex(),result);
resList.add(map);
}
} catch (IOException e) {
System.out.println("==============");
}
return resList;
}
private BoolQueryBuilder queryBuilderIsNull(String flied) {
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
QueryBuilder termQueryBuilder = QueryBuilders.existsQuery(flied);
BoolQueryBuilder filterQueryBuilder = QueryBuilders.boolQuery().filter(termQueryBuilder);
boolBuilder.mustNot(filterQueryBuilder);
return boolBuilder;
}
}