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

}
相关推荐
Elastic 中国社区官方博客26 分钟前
使用 Elastic Cloud Serverless 扩展批量索引
大数据·运维·数据库·elasticsearch·搜索引擎·云原生·serverless
没有bug.的程序员1 小时前
服务安全:内部服务如何防止“裸奔”?
java·网络安全·云原生安全·服务安全·零信任架构·微服务安全·内部鉴权
一线大码1 小时前
SpringBoot 3 和 4 的版本新特性和升级要点
java·spring boot·后端
weixin_440730501 小时前
java数组整理笔记
java·开发语言·笔记
weixin_425023001 小时前
Spring Boot 实用核心技巧汇总:日期格式化、线程管控、MCP服务、AOP进阶等
java·spring boot·后端
一线大码1 小时前
Java 8-25 各个版本新特性总结
java·后端
Dxy12393102162 小时前
Elasticsearch 8.13.4 内存占用过大如何处理
大数据·elasticsearch·搜索引擎
2501_906150562 小时前
私有部署问卷系统操作实战记录-DWSurvey
java·运维·服务器·spring·开源
better_liang2 小时前
每日Java面试场景题知识点之-TCP/IP协议栈与Socket编程
java·tcp/ip·计算机网络·网络编程·socket·面试题
niucloud-admin2 小时前
java服务端——controller控制器
java·开发语言