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、报错
1-5、新增依赖
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>2.0.1</version>
</dependency>
1-6、重新进行测试,再次报错
1-7、因为导入的 gulimall-common 中有数据库依赖,需要禁用数据源自动配置
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
1-8、再次测试,成功
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、报错
2-3、将配置类 RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build(); 中的 localhost 换为虚拟机ip
2-4、再次进行测试,成功
不必事先手动创建名为"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、报错
3-3、将 Bank 变为静态类 static class Bank(),再次测试,报错
3-4、在 accountNumber 上添加注解 @JsonProperty("account_number"),将 "account_number" 字段映射到正确的属性名
3-5、再次测试,成功
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、测试,成功打印