JAVA 集成 ElasticSearch

目录

[ElasticSearch Client](#ElasticSearch Client)

[Java REST Client](#Java REST Client)

Dependencies

Initialization

RequestOptions

测试


ElasticSearch Client

9300端口 :TCP协议,性能较高,ES集群内部节点之间通过9300进行通讯。

9200端口:HTTP协议,通过http请求和ES进行交互。跨语言兼容性好,易于调试。


Java REST Client

谷粒商城 ES 7.4.2 仅支持 Java REST Client ,之后若有需要 再进行重构

Dependencies

XML 复制代码
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.4.2</version>
</dependency>

由于spring-boot-dependencies中<elasticsearch.version>有默认值,为避免冲突,应手动指定版本

XML 复制代码
 <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
        <elasticsearch.version>7.4.2</elasticsearch.version>
 </properties>

Initialization

  • 给容器中注入一个 RestHighLevelClient
java 复制代码
@Configuration
public class GulimallElasticSearchConfig {
    @Value("${search.host.address}")
    private String hostName;
    @Bean
    public RestHighLevelClient esRestClient() {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost(hostName, 9200, "http")
                )
        );
        return client;
    }
}

GulimallSearchApplicationTests中注入的RestHighLevelClient NotNull即可

RequestOptions

RequestOptions 主要用于:

  • 共享配置:在多个请求之间共享相同的配置(如认证信息、超时设置等)。

  • 简化代码:避免在每个请求中重复设置相同的参数。

  • 提高性能:通过复用配置,减少不必要的对象创建和内存开销。

java 复制代码
private static final RequestOptions COMMON_OPTIONS;
static {
    RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
    builder.addHeader("Authorization", "Bearer " + TOKEN); 
    builder.setHttpAsyncResponseConsumerFactory(           
        new HttpAsyncResponseConsumerFactory
            .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
    COMMON_OPTIONS = builder.build();
}

测试

source 可以以4种方式提供,即 Json字符串,map,XContentBuilder 或 键值对

java 复制代码
    @Autowired
    private RestHighLevelClient esRestClient;
    @Test
    public void indexApi() throws IOException {
        //索引名
        IndexRequest request = new IndexRequest("user");
        request.id("1");
        User user=new User();
        user.setName("asuka");user.setAge("18");user.setGender("女");
        String userJson= JSON.toJSONString(user);
        request.source(userJson, XContentType.JSON);
        //同步请求
        IndexResponse indexResponse = esRestClient.index(request, GulimallElasticSearchConfig.COMMON_OPTIONS);
        System.out.println(indexResponse);
    }
    @Data
    class User{
        private String name;
        private String age;
        private String gender;
    }

SearchSourceBuilder:DSL根操作,如query,aggregations,from,size等

java 复制代码
    @Autowired
    private RestHighLevelClient esRestClient;
    
    @Test
    public void searchApi() throws IOException {
        SearchRequest searchRequest = new SearchRequest("my_bank");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
        searchSourceBuilder.size(5);
        //求平均薪资
        AggregationBuilder avgBalance= AggregationBuilders.avg("avgBalance").field("balance");
        searchSourceBuilder.aggregation(avgBalance);
        //依据年龄分组
        AggregationBuilder byAgeAggregationBuilder= AggregationBuilders.terms("by_age").field("age");
        searchSourceBuilder.aggregation(byAgeAggregationBuilder);

        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = esRestClient.search(searchRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
        System.out.println(searchResponse);

        SearchHits hits= searchResponse.getHits();
        for (SearchHit hit : hits.getHits()) {
            System.out.println(hit);//也可通过JSON.parseObject() 转换为 对象
        }

        //获取聚合信息
        Aggregations aggregations = searchResponse.getAggregations();
        //依据名字取出各聚合
        Avg balanceAvg = aggregations.get("avgBalance");
        System.out.println("平均薪资: " + balanceAvg.getValue());

        Terms byAgeAggregation = aggregations.get("by_age");
        for (Terms.Bucket bucket: byAgeAggregation.getBuckets()) {
            System.out.println("年龄 :" +bucket.getKey()+ " 数量:"+ bucket.getDocCount());
        }
    }
相关推荐
全栈陈序员1 分钟前
【Python】基础语法入门(三十三)—— 日志系统详解:用 logging 记录程序运行
java·开发语言·python
ESDWAN3 分钟前
SD-WAN 是什么?工作原理、适用场景与选型要点
开发语言·网络·数据库·架构·php
她的男孩10 分钟前
低代码加字段后表结构怎么同步:预览安全 DDL,高风险变更再强制执行
java·spring boot·低代码
Elastic 中国社区官方博客14 分钟前
Elastic 在《Forrester Wave™:2026 年第四季度智能运维平台》报告中被评为强劲表现者
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索
简简单单就是我_hehe16 分钟前
一次 ClickHouse 服务器磁盘告警的排查与修复实录
java·服务器·前端
Thomas.Sir21 分钟前
第11课:文件上传下载、跨域CORS配置,SpringBoot4.x跨域新方案
java·spring boot
iCxhust24 分钟前
C#双时区时钟设计
开发语言·c#
wuminyu26 分钟前
JVM规范学习总结:class执行性能差异
java·linux·c语言·jvm·c++
sbjdhjd32 分钟前
从污点追踪断点到 PHP-FPM 请求队列:HIDS PHP WebShell 样本复盘
开发语言·网络安全·数据挖掘·渗透测试·开源·php·shell
Elasticsearch35 分钟前
Elastic Cloud 无服务器服务审计日志:将审计记录发送到可观测性或安全解决方案
elasticsearch