ElasticSearch学习笔记-解析JSON格式的内容

如果需要屏蔽其他项目对Elasticsearch的直接访问操作,统一由一个入口访问操作Elasticsearch,可以考虑直接传入JSON格式语句解析执行。
  • 相关依赖包
typescript 复制代码
<properties>
    <elasticsearch.version>7.9.3</elasticsearch.version>
    <elasticsearch.rest.version>7.9.3</elasticsearch.rest.version>
</properties>

<!-- Elasticsearch依赖包-->
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>${elasticsearch.version}</version>
</dependency>

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>${elasticsearch.version}</version>
</dependency>

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>${elasticsearch.rest.version}</version>
</dependency>

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>${elasticsearch.rest.version}</version>
</dependency>
  • 部分代码
java 复制代码
    protected static final NamedXContentRegistry namedXContentRegistry;

    static {
        SearchModule searchModule = new SearchModule(Settings.builder().build(), false, new ArrayList<>());
        List<NamedXContentRegistry.Entry> namedXContents = searchModule.getNamedXContents();
        namedXContents.addAll(getDefaultNamedXContents());
        namedXContentRegistry = new NamedXContentRegistry(namedXContents);
    }

    protected SearchResponse searchResponse(RestHighLevelClient restHighLevelClient, String statement,
            Map<String, Object> params, String... indices) {
        SearchResponse searchResponse = null;
        SearchRequest searchRequest = new SearchRequest(indices);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        try {
            searchSourceBuilder.parseXContent(XContentType.JSON.xContent().createParser(namedXContentRegistry,
                DeprecationHandler.IGNORE_DEPRECATIONS, statement));
            searchRequest.source(searchSourceBuilder);
            Object scrollTimeoutObj = params.get(SCROLL_TIMEOUT);
            if (null != scrollTimeoutObj) {
                searchRequest.scroll(String.valueOf(scrollTimeoutObj));
            }
            long startTimeMillis = System.currentTimeMillis();
            searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            executionSqlLog(statement, startTimeMillis, indices);
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
        return searchResponse;
    }

    protected SearchResponse scrollSearchResponse(RestHighLevelClient restHighLevelClient, String scrollId) {
        try {
            return restHighLevelClient.scroll(new SearchScrollRequest(scrollId), RequestOptions.DEFAULT);
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }

    protected CountResponse countResponse(RestHighLevelClient restHighLevelClient, String statement,
            Map<String, Object> params, String... indices) {
        CountResponse countResponse = null;
        CountRequest countRequest = new CountRequest(indices);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        try {
            searchSourceBuilder.parseXContent(XContentType.JSON.xContent().createParser(namedXContentRegistry,
                DeprecationHandler.IGNORE_DEPRECATIONS, statement));
            countRequest.source(searchSourceBuilder);
            long startTimeMillis = System.currentTimeMillis();
            countResponse = restHighLevelClient.count(countRequest, RequestOptions.DEFAULT);
            executionSqlLog(statement, startTimeMillis, indices);
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
        return countResponse;
    }

    private static List<NamedXContentRegistry.Entry> getDefaultNamedXContents() {
        Map<String, ContextParser<Object, ? extends Aggregation>> map = new HashMap<>();
        map.put(TopHitsAggregationBuilder.NAME, (p, c) -> ParsedTopHits.fromXContent(p, (String) c));
        map.put(DateRangeAggregationBuilder.NAME, (p, c) -> ParsedDateRange.fromXContent(p, (String) c));
        map.put(FilterAggregationBuilder.NAME, (p, c) -> ParsedFilter.fromXContent(p, (String) c));
        map.put(SumAggregationBuilder.NAME, (p, c) -> ParsedSum.fromXContent(p, (String) c));
        map.put(CardinalityAggregationBuilder.NAME, (p, c) -> ParsedCardinality.fromXContent(p, (String) c));
        map.put(StringTerms.NAME, (p, c) -> ParsedStringTerms.fromXContent(p, (String) c));
        map.put(LongTerms.NAME, (p, c) -> ParsedLongTerms.fromXContent(p, (String) c));
        map.put(DoubleTerms.NAME, (p, c) -> ParsedDoubleTerms.fromXContent(p, (String) c));
        return map.entrySet().stream().map(entry ->
            new NamedXContentRegistry.Entry(Aggregation.class, new ParseField(entry.getKey()), entry.getValue()))
                .collect(Collectors.toList());
    }

    private void executionSqlLog(String statement, long startTimeMillis, String... indices) {
        if (!esProperties.isExecutionSqlEnable()) {
            return;
        }
        long spendTime = System.currentTimeMillis() - startTimeMillis;
        log.info(
            "\n==============  SQL START  ==============" +
            "\nExecution INX :{} [{} ms]" +
            "\nExecution SQL :{}" +
            "\n==============  SQL END    ==============\n", String.join(Constants.SYMBOL_COMMA, indices),
                spendTime, statement.replaceAll("\\s{2,}", " "));
    }

}
相关推荐
独断万古他化35 分钟前
【抽奖系统开发实战】Spring Boot 抽奖模块全解析:MQ 异步处理、缓存信息、状态扭转与异常回滚
java·spring boot·redis·后端·缓存·rabbitmq·mvc
weisian15139 分钟前
Java并发编程--12-读写锁与StampedLock:高并发读场景下的性能优化利器
java·开发语言·性能优化·读写锁·stampedlock
回到原点的码农9 小时前
Spring Data JDBC 详解
java·数据库·spring
gf13211119 小时前
python_查询并删除飞书多维表格中的记录
java·python·飞书
zb200641209 小时前
Spring Boot 实战:轻松实现文件上传与下载功能
java·数据库·spring boot
一勺菠萝丶9 小时前
Flowable + Spring 集成踩坑:流程结束监听器查询历史任务为空 & 获取不到审批意见
java·数据库·spring
jwn9999 小时前
Spring Boot 整合 Keycloak
java·spring boot·后端
宁波阿成9 小时前
OpenClaw 在 Ubuntu 22.04.5 LTS 上的安装与问题处理记录
java·linux·ubuntu·openclaw·龙虾
mldlds9 小时前
SpringBoot详解
java·spring boot·后端
kang_jin9 小时前
Spring Boot 自动配置
java·spring boot·后端