RestHighLevelClient 查询
1.pom添加依赖
<!-- elasticsearch -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency><!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
2.EsConfig 配置
@Configuration
public class EsConfig {
private static final Logger log = LoggerFactory.getLogger(EsConfig.class);static final String COLON = ":";
static final String COMMA = ",";@Value("${spring.data.elasticsearch.cluster-name}")
private String clusterName;@Value("${spring.data.elasticsearch.cluster-nodes}")
private String clusterAddress;@Bean
public RestHighLevelClient getRestHighLevelClient() {
String[] nodes = clusterAddress.split(COMMA);
HttpHost[] hosts = new HttpHost[nodes.length];for (int i = 0, j = nodes.length; i < j; i++) {
String hostName = nodes[i].split(COLON)[0];
String port = nodes[i].split(COLON)[1];
Assert.hasText(hostName, "[Assertion failed] missing host name in 'clusterNodes'");
Assert.hasText(port, "[Assertion failed] missing port in 'clusterNodes'");
log.info("adding transport node : " + nodes[i]);
hosts[i] = new HttpHost(hostName, Integer.valueOf(port));
}RestClientBuilder builder = RestClient.builder(hosts).setHttpClientConfigCallback(callback -> {
callback.disableAuthCaching();
return callback.setKeepAliveStrategy((response, context) -> {
Args.notNull(response, "HTTP response");
final HeaderElementIterator it = new BasicHeaderElementIterator(
response.headerIterator(HTTP.CONN_KEEP_ALIVE));
while (it.hasNext()) {
final HeaderElement he = it.nextElement();
final String param = he.getName();
final String value = he.getValue();
if (value != null && param.equalsIgnoreCase("timeout")) {
try {
return Long.parseLong(value) * 1000;
} catch (final NumberFormatException ignore) {
}
}
}
return 10 * 1000;
});
});
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);
return restHighLevelClient;
}
3.查询
@Autowired
private RestHighLevelClient client;/**
* ES嵌套查询最外层数据转换成导出数据.
*
* @param source
* @param export
* @throws ParseException
* @throws ExecutionException
* @throws InterruptedException
*/
@Override
public List<DetectHistory> search(ExportRequest request)
throws ParseException, InterruptedException, ExecutionException {
List<DetectHistory> detectHistorieList = new LinkedList<>();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
try {
// 创建builder
BoolQueryBuilder builder = createBuilder(request);
SortBuilder sortBuilder = SortBuilders.fieldSort("capturedTime").order(SortOrder.DESC);
int size = 0;
int from = 0;
if (request.getFrom() - request.getTo() == 0) {
size = 1;
} else {
size = request.getTo() - request.getFrom() + 1;
}
if (request.getFrom() > ExportConstant.ONE) {
from = request.getFrom() - 1;
}
SearchRequest searchRequest = new SearchRequest("tdhistory");
searchRequest.types("tdhistory");
sourceBuilder.from(from);
sourceBuilder.size(size);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
sourceBuilder.query(builder);
searchRequest.source(sourceBuilder);
sourceBuilder.sort(sortBuilder);
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
log.info("td Conditional query total :" + searchHits.getTotalHits());
DetectHistory detectHistory = null;
for (SearchHit searchHit : searchHits) {
detectHistory = JSON.parseObject(searchHit.getSourceAsString(), DetectHistory.class);
detectHistorieList.add(detectHistory);
}
return detectHistorieList;
} catch (Exception e) {
e.printStackTrace();
}
return detectHistorieList;
}BoolQueryBuilder builder = QueryBuilders.boolQuery();
public BoolQueryBuilder createBuilder(ExportRequest request) {
try {
// 创建builder
BoolQueryBuilder builder = QueryBuilders.boolQuery();
Long startTime = request.getCaptureTimeStart();
Long endTime = request.getCaptureTimeEnd();
// 抓拍时间筛选
builder.must(QueryBuilders.rangeQuery("capturedTime").gte(startTime).lte(endTime));
// 摄像头 ID
if (request.getCameraIds().size() > 0 && request.getCameraIds().get(0) > 0) {
builder.must(QueryBuilders.termsQuery("camera.id", request.getCameraIds()));
}
// 人像库
if (request.getFaceDatabase().size() > 0 && request.getFaceDatabase().get(0) > 0) {
builder.must(QueryBuilders.termsQuery("targetLibrary.id", request.getFaceDatabase()));
}
// 确认时间筛
RangeQueryBuilder confirmRangeQueryBuilder = QueryBuilders.rangeQuery("acknowledge.operationTime");
// 确认状态
if (!StringUtils.isEmpty(request.getConfirmStatus()) && Integer.parseInt(request.getConfirmStatus()) > 0) {
if (!StringUtils.isEmpty(request.getConfirmTimeStart())) {
Long confirmStart = request.getConfirmTimeStart();
confirmRangeQueryBuilder.gte(confirmStart);
}
if (!StringUtils.isEmpty(request.getConfirmTimeEnd())) {
Long confirmEnd = request.getConfirmTimeEnd();
confirmRangeQueryBuilder.lte(confirmEnd);
}
builder.must(confirmRangeQueryBuilder);
QueryBuilders.termQuery("acknowledge.status.keyword", request.getConfirmStatus());
builder.must(confirmRangeQueryBuilder);
builder.must(QueryBuilders.termQuery("acknowledge.status.keyword", request.getConfirmStatus()));
}
BoolQueryBuilder keywordQueryShould = QueryBuilders.boolQuery();
String keyword = request.getName();
// 搜索关键字
if (!StringUtils.isEmpty(keyword)) {
String keywordLower = "*" + keyword.toLowerCase() + "*";
keyword = "*" + keyword + "*";
keywordQueryShould.should(QueryBuilders.wildcardQuery("target.lowerName.keyword", keywordLower));
keywordQueryShould.should(QueryBuilders.wildcardQuery("target.lowerDept.keyword", keywordLower));
keywordQueryShould.should(QueryBuilders.wildcardQuery("target.lowerCompany.keyword", keywordLower));
keywordQueryShould.should(QueryBuilders.wildcardQuery("camera.name.keyword", keyword));
keywordQueryShould.should(QueryBuilders.wildcardQuery("camera.groupName.keyword", keyword));
keywordQueryShould.should(QueryBuilders.wildcardQuery("targetLibrary.name.keyword", keyword));
keywordQueryShould.should(QueryBuilders.wildcardQuery("target.cardId.keyword", keyword));
keywordQueryShould.should(QueryBuilders.wildcardQuery("target.company.keyword", keyword));
keywordQueryShould.should(QueryBuilders.wildcardQuery("target.nationality.keyword", keyword));
keywordQueryShould.should(QueryBuilders.wildcardQuery("acknowledge.realname.keyword", keyword));
}
builder.must(keywordQueryShould);
// 比对结果
if (!StringUtils.isEmpty(request.getComparedType()) && request.getComparedType().size() > 0) {
BoolQueryBuilder comparedShould = QueryBuilders.boolQuery();
createComparedShould(comparedShould, request);
builder.must(comparedShould);
}
} catch (Exception e) {
e.printStackTrace();
}
return builder;
}public void createComparedShould(BoolQueryBuilder comparedShould,ExportRequest request) {
List<String> types = request.getComparedType();
BoolQueryBuilder comparedBuilder = null;
for (String type : types) {
switch (type) {
case "NORMAL":
comparedBuilder = QueryBuilders.boolQuery();
comparedBuilder.must(QueryBuilders.matchQuery("detectStatus.keyword",
ComparedTypeEnum.NORMAL.getDetectStatus()));
comparedBuilder
.must(QueryBuilders.matchQuery("status.keyword", ComparedTypeEnum.NORMAL.getStatus()));
comparedShould.should(comparedBuilder);
break;
case "ABNORMAL":
comparedBuilder = QueryBuilders.boolQuery();
comparedBuilder.must(QueryBuilders.matchQuery("detectStatus.keyword",
ComparedTypeEnum.ABNORMAL.getDetectStatus()));
comparedBuilder.must(
QueryBuilders.matchQuery("status.keyword", ComparedTypeEnum.ABNORMAL.getStatus()));
comparedShould.should(comparedBuilder);
break;
case "STRANGER":
comparedBuilder = QueryBuilders.boolQuery();
comparedBuilder.must(QueryBuilders.matchQuery("detectStatus.keyword",
ComparedTypeEnum.STRANGER.getDetectStatus()));
comparedBuilder.must(
QueryBuilders.matchQuery("status.keyword", ComparedTypeEnum.STRANGER.getStatus()));
comparedShould.should(comparedBuilder);
break;
default:
break;
}
}
}
OK。查询结束