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

}
相关推荐
AI你一生一世1 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
云-缩影1 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
瑞克-桑切斯1 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
全栈陈序员2 小时前
【Git】从入门到精通(五)—— git add:将文件加入暂存区
大数据·git·elasticsearch
全栈陈序员4 小时前
【Git】从入门到精通(七)—— git status:查看仓库状态
大数据·git·elasticsearch
fengye2071616 小时前
第三章 编译cpython
大数据·elasticsearch·搜索引擎
海的透彻6 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat6 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
后台模板学习7 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one7 小时前
算法--构造
java·数据结构·算法