• A+

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。查询结束

 

所属分类:后台

全部评论: 0

    我有话说:
    ×