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

}
相关推荐
java—大象1 小时前
基于JavaWeb开发的Java+Jsp+SpringMVC漫威手办商城系统设计和实现
java·开发语言·数据库·spring boot·python·课程设计
27669582922 小时前
新版231普通阿里滑块 自动化和逆向实现 分析
java·python·node.js·自动化·go·231滑块·阿里231
java1234_小锋2 小时前
Redis有哪些常用应用场景?
java·开发语言
神仙别闹2 小时前
基于 Java 的 C 语言编译器
java·c语言·开发语言
Java学长-kirito2 小时前
springboot/ssm互联网智慧医院体检平台web健康体检管理系统Java代码编写
java·spring boot·后端
ChinaRainbowSea2 小时前
五. Redis 配置内容(详细配置说明)
java·数据库·redis·缓存·bootstrap·nosql
长路 ㅤ   3 小时前
深入理解和使用定时线程池ScheduledThreadPoolExecutor
java·定时线程池
爱好读书3 小时前
SQL 秒变 ER 图 sql转er图
java·数据库·sql·mysql·课程设计
ACGkaka_3 小时前
Java 如何覆盖第三方 jar 包中的类
java·python·jar
biubiubiu07063 小时前
关于maven
java·linux·maven