谷粒商城 SpringBoot集成Elasticsearch8.6

1、SpringBoot集成Elasticsearch8.6

1-1、参考 Installation | Elasticsearch Java API Client [8.6] | Elastic,导入依赖

<dependency>
    <groupId>co.elastic.clients</groupId>
    <artifactId>elasticsearch-java</artifactId>
    <version>8.6.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>

1-2、参考 Connecting | Elasticsearch Java API Client [8.6] | Elastic,编写配置类

@Configuration
public class GulimallSearchConfig {
    @Bean
    public ElasticsearchClient elasticsearchClient(){
        RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
        ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
        return new ElasticsearchClient(transport);
    }
}

1-3、测试

@Autowired
private ElasticsearchClient elasticsearchClient;
@Test
public void contextLoads() {
    System.out.println(elasticsearchClient);
}

1-4、报错

img

1-5、新增依赖

<dependency>
    <groupId>jakarta.json</groupId>
    <artifactId>jakarta.json-api</artifactId>
    <version>2.0.1</version>
</dependency>

1-6、重新进行测试,再次报错

img

1-7、因为导入的 gulimall-common 中有数据库依赖,需要禁用数据源自动配置

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

1-8、再次测试,成功

img

2、测试存储数据到 es

2-1、参考 Indexing single documents | Elasticsearch Java API Client [8.6] | Elastic,编写代码

@Autowired
private ElasticsearchClient elasticsearchClient;
@Test
public void indexData() throws IOException {
    User user = new User("张三", "男", 20);
    IndexResponse indexResponse = elasticsearchClient.index(i -> i
            .index("users")
            .id("1")
            .document(user));
    System.out.println(indexResponse);
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class User{
    private String userName;
    private String gender;
    private Integer age;
}

2-2、报错

img

2-3、将配置类 RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build(); 中的 localhost 换为虚拟机ip

2-4、再次进行测试,成功

img

不必事先手动创建名为"users"的索引,如果该索引已经存在,它会将数据添加到该索引中,如果索引不存在,则会尝试创建该索引并添加数据

3、复杂查询

3-1、参考 Searching for documents | Elasticsearch Java API Client [8.6] | Elastic,查询数据

@Autowired
private ElasticsearchClient elasticsearchClient;
@Test
public void searchData() throws IOException {
    SearchResponse<Bank> response = elasticsearchClient.search(s -> s
            .index("bank")
            .query(q -> q
                    .match(t -> t
                            .field("address")
                            .query("mill")
                    )
            ), Bank.class
    );
    System.out.println(response);
}
@Data
class Bank {
    private long accountNumber;
    private String address;
    private int age;
    private long balance;
    private String city;
    private String email;
    private String employer;
    private String firstname;
    private String gender;
    private String lastname;
    private String state;
}

3-2、报错

img

3-3、将 Bank 变为静态类 static class Bank(),再次测试,报错

img

3-4、在 accountNumber 上添加注解 @JsonProperty("account_number"),将 "account_number" 字段映射到正确的属性名

3-5、再次测试,成功

img

4、聚合查询

4-1、参考 Aggregations | Elasticsearch Java API Client [8.6] | Elastic,编写代码

@Autowired
private ElasticsearchClient elasticsearchClient;
@Test
public void searchData() throws IOException {
    SearchResponse<Bank> response = elasticsearchClient.search(s -> s
            .index("bank")
            .query(q -> q
                    .match(t -> t
                            .field("address")
                            .query("mill")
                    )
            )
            .aggregations("ageAgg", a -> a
                    .terms(h -> h
                            .field("age")
                            .size(10)
                    )
            )
            .aggregations("balanceAvg", a -> a
                    .avg(h -> h
                            .field("balance")
                    )
            ), Bank.class
    );
    System.out.println(response);
    List<Hit<Bank>> hits = response.hits().hits();
    for (Hit<Bank> hit: hits) {
        Bank bank = hit.source();
        System.out.println("bank:" + bank);
    }
    List<LongTermsBucket> ageAgg = response.aggregations().get("ageAgg").lterms().buckets().array();
    for (LongTermsBucket bucket: ageAgg) {
        System.out.println("年龄:" + bucket.key() + "===>" + bucket.docCount());
    }
    AvgAggregate balanceAvg = response.aggregations().get("balanceAvg").avg();
    System.out.println("平均薪资:" + balanceAvg.value());
}
​
@Data
static class Bank {
    @JsonProperty("account_number")
    private long accountNumber;
    private String address;
    private int age;
    private long balance;
    private String city;
    private String email;
    private String employer;
    private String firstname;
    private String gender;
    private String lastname;
    private String state;
}

4-2、测试,成功打印

img

img

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值