目录

Elasticsearch Java 实践

Elasticsearch 更新太快, Spring Boot 比较延迟,如果想体验最新版本, 需要使用官方 Java API Client

Elasticsearch Java API Client

Java API Client 特性 :

  • 所有 Elasticsearch API 的强类型请求和响应。
  • 所有 API 的阻塞和异步版本。
  • 在创建复杂的嵌套结构时,使用流利的构建器和功能模式允许编写简洁易读的代码。
  • 通过使用对象映射器(例如 Jackson)或任何 JSON-B 实现来无缝集成应用程序类。
  • 将协议处理委托给 http 客户端,例如Java 低级 REST 客户端,该客户端 负责处理所有传输级别的问题:HTTP 连接池、重试、节点发现等。
1
2
3
4
5
6
7
8
dependencies {
    implementation 'co.elastic.clients:elasticsearch-java:8.1.3'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3'

    // Needed only if you use the spring-dependency-management
    // and spring-boot Gradle plugins
    implementation 'jakarta.json:jakarta.json-api:2.0.1' 
}

Spring Boot

spring-boot-starter-data-elasticsearch 一定注意 Spring Data Elasticsearch 与 Elasticsearch 的版本匹配,不然会有各种莫名其妙的错误。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {

  @Override
  @Bean
  public RestHighLevelClient elasticsearchClient() {

    final ClientConfiguration clientConfiguration =
        ClientConfiguration.builder().connectedTo("localhost:9200").build();

    return RestClients.create(clientConfiguration).rest();
  }
}

@Configuration
@EnableElasticsearchRepositories(basePackages = "com.ynthm.library.av.jvadb.repository")
public class ElasticSearchConfiguration {}

Java High Level REST Clientedit Deprecated in 7.15.0.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Document(indexName = "productindex")
public class Product {
  @Id
  private String id;
  
  @Field(type = FieldType.Text, name = "name")
  private String name;
  
  @Field(type = FieldType.Double, name = "price")
  private Double price;
  
  @Field(type = FieldType.Integer, name = "quantity")
  private Integer quantity;
  
  @Field(type = FieldType.Keyword, name = "category")
  private String category;
  
  @Field(type = FieldType.Text, name = "desc")
  private String description;
  
  @Field(type = FieldType.Keyword, name = "manufacturer")
  private String manufacturer;

}
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
  List<Product> findByName(String name);
  
  List<Product> findByNameContaining(String name);
 
  List<Product> findByManufacturerAndCategory
       (String manufacturer, String category);
}