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,}", " "));
    }

}
相关推荐
m0_587383009 小时前
碰碰好评卡功能落地全流程实战指南 附核心逻辑与常见问题解决方案
java·前端·数据库·后端·struts·需求分析
cheems95279 小时前
从统一响应到 Swagger:一篇讲清微服务接口文档设计未命名
java·微服务·架构·状态模式
Y3815326629 小时前
SerpBase + RAG 实战:用搜索 API 给知识库接上实时数据,回答不再过期
java·服务器·数据库
开开心心就好9 小时前
文件关联被破坏怎么修?免费工具一键修复
java·服务器·开发语言·pdf·ocr·启发式算法·宽度优先
不停喝水9 小时前
【前端转全栈java速通课】 项目实战④12-14节 拦截器过滤器和全局配置-cors跨域设置-token体系-利用session做验证码
java·开发语言·前端·ai·容器
鱼宵9 小时前
Spring AI RAG 问答助手:回答带引用,AI 不再睁眼说瞎话
java·人工智能·spring·springai
rannn_1119 小时前
项目缓存实战:热点 Key 击穿、缓存穿透与多级缓存架构
java·缓存·架构
用户094248568039 小时前
第37章:JVM极端场景调优与生产故障复盘方法论
java·jvm
知守观9 小时前
同事的 SNAPSHOT 更新了,我三天后才拉到:Maven 更新检查被 _remote.repositories 静默跳过
java·后端·maven
Wang's Blog9 小时前
Java 项目实战: 交友项目 - 项目模块划分与依赖关系
java·开发语言·交友