溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Springboot2.x整合ElasticSearch7.x的過程是怎樣的

發布時間:2021-09-29 15:49:12 來源:億速云 閱讀:178 作者:柒染 欄目:大數據
# Spring Boot 2.x整合Elasticsearch 7.x的全過程詳解

## 一、前言

### 1.1 技術背景
Elasticsearch作為基于Lucene的分布式搜索引擎,以其**高性能、可擴展性**和**豐富的查詢功能**成為大數據搜索領域的首選方案。Spring Boot作為Java生態中最流行的微服務框架,其**約定優于配置**的理念極大簡化了企業級應用開發。

### 1.2 版本選擇考量
- Spring Boot 2.3.x+ 官方開始支持ES 7.x客戶端
- Elasticsearch 7.x 移除type概念,性能提升40%
- 注意JDK版本兼容性(ES7需要JDK11+)

## 二、環境準備

### 2.1 基礎環境配置
```bash
# 開發環境要求
- JDK 11+
- Maven 3.6+
- Elasticsearch 7.9.2(測試版本)

2.2 依賴引入

<!-- pom.xml關鍵依賴 -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>
    <!-- 使用High Level REST Client -->
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.9.2</version>
    </dependency>
</dependencies>

三、核心配置詳解

3.1 配置文件

# application.yml
spring:
  elasticsearch:
    rest:
      uris: http://localhost:9200
      username: elastic
      password: changeme
      connection-timeout: 5000
      read-timeout: 30000

3.2 Java配置類

@Configuration
public class ElasticsearchConfig {

    @Value("${spring.elasticsearch.rest.uris}")
    private String[] uris;

    @Bean
    public RestHighLevelClient client() {
        ClientConfiguration config = ClientConfiguration.builder()
            .connectedTo(uris)
            .withConnectTimeout(Duration.ofSeconds(5))
            .withSocketTimeout(Duration.ofSeconds(30))
            .build();
        return RestClients.create(config).rest();
    }
}

四、數據模型設計

4.1 實體類映射

@Document(indexName = "products", createIndex = false)
public class Product {
    @Id
    private String id;
    
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String name;
    
    @Field(type = FieldType.Double)
    private Double price;
    
    @Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second)
    private Date createTime;
}

4.2 自定義映射配置

PUT /products
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "price": {
        "type": "scaled_float",
        "scaling_factor": 100
      }
    }
  }
}

五、Repository操作

5.1 基礎CRUD接口

public interface ProductRepository extends ElasticsearchRepository<Product, String> {
    
    List<Product> findByName(String name);
    
    Page<Product> findByPriceBetween(Double min, Double max, Pageable pageable);
}

5.2 自定義查詢示例

@Repository
public class ProductCustomRepositoryImpl implements ProductCustomRepository {

    @Autowired
    private RestHighLevelClient client;

    public List<Product> complexQuery(String keyword, Date startDate) {
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        queryBuilder.withQuery(QueryBuilders.boolQuery()
            .must(QueryBuilders.matchQuery("name", keyword))
            .filter(QueryBuilders.rangeQuery("createTime").gte(startDate)));
        
        SearchHits<Product> hits = elasticsearchOperations.search(
            queryBuilder.build(), Product.class);
        // 結果處理...
    }
}

六、高級特性集成

6.1 異步操作

@Async
public CompletableFuture<Page<Product>> asyncSearch(String query) {
    NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.queryStringQuery(query))
        .build();
    return CompletableFuture.completedFuture(
        elasticsearchOperations.queryForPage(searchQuery, Product.class));
}

6.2 批量處理

@Autowired
private ElasticsearchRestTemplate template;

public void bulkIndex(List<Product> products) {
    BulkRequest bulkRequest = new BulkRequest();
    products.forEach(p -> {
        IndexRequest request = new IndexRequest("products")
            .id(p.getId())
            .source(BeanUtil.beanToMap(p));
        bulkRequest.add(request);
    });
    client.bulk(bulkRequest, RequestOptions.DEFAULT);
}

七、性能優化方案

7.1 連接池配置

@Bean
public RestClientBuilderCustomizer restClientBuilderCustomizer() {
    return builder -> builder
        .setHttpClientConfigCallback(httpClientBuilder -> {
            httpClientBuilder.setMaxConnTotal(50);
            httpClientBuilder.setMaxConnPerRoute(10);
            return httpClientBuilder;
        });
}

7.2 查詢優化技巧

// 使用source filtering減少網絡傳輸
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
    .fetchSource(new String[]{"name", "price"}, null);

// 啟用查詢緩存
QueryBuilder queryBuilder = QueryBuilders
    .termQuery("category", "electronics")
    .queryName("cached_query");

八、異常處理

8.1 統一異常攔截

@ControllerAdvice
public class ElasticsearchExceptionHandler {

    @ExceptionHandler(ElasticsearchStatusException.class)
    public ResponseEntity<String> handleEsException(ElasticsearchStatusException e) {
        return ResponseEntity.status(e.status().getStatus())
            .body("ES服務異常: " + e.getDetailedMessage());
    }
}

8.2 重試機制

@Retryable(value = { ElasticsearchException.class }, 
           maxAttempts = 3, 
           backoff = @Backoff(delay = 1000))
public void updateProduct(Product product) {
    // 更新操作...
}

九、測試驗證

9.1 集成測試

@SpringBootTest
@ExtendWith(SpringExtension.class)
public class ProductRepositoryTest {

    @Autowired
    private ProductRepository repository;

    @Test
    public void testIndexAndSearch() {
        Product product = new Product();
        product.setName("華為手機");
        repository.save(product);
        
        List<Product> result = repository.findByName("華為");
        assertThat(result).hasSize(1);
    }
}

9.2 性能測試

@Test
public void benchmarkSearch() {
    int threadCount = 50;
    ExecutorService executor = Executors.newFixedThreadPool(threadCount);
    
    LongAdder counter = new LongAdder();
    IntStream.range(0, 1000).forEach(i -> {
        executor.submit(() -> {
            repository.search(new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.matchAllQuery()).build());
            counter.increment();
        });
    });
    
    // 輸出QPS...
}

十、生產實踐建議

10.1 集群部署方案

  • 推薦3個master節點(奇數原則)
  • 數據節點根據數據量配置(建議16核64G內存)
  • 使用Ingest節點處理數據預處理

10.2 監控方案

# 集成Prometheus監控
management:
  endpoints:
    web:
      exposure:
        include: prometheus,health,info
  metrics:
    export:
      prometheus:
        enabled: true

十一、版本升級指南

11.1 從6.x升級到7.x

  1. 重建索引的兼容性方案
  2. 類型(type)字段的遷移策略
  3. 查詢語法的變化點對比

十二、總結

本文詳細介紹了Spring Boot 2.x與Elasticsearch 7.x整合的全流程,涵蓋從環境搭建到生產部署的完整知識體系。關鍵點包括: 1. 使用RestHighLevelClient替代TransportClient 2. 新版Spring Data Elasticsearch的API變化 3. 性能調優的二十個實用技巧

最佳實踐建議:對于高并發場景,建議結合Spring Cache實現二級緩存,可降低ES集群壓力30%以上。 “`

(注:實際文章內容會根據技術細節展開每個章節的詳細說明,包含代碼示例的完整實現、參數調優的具體數值分析、性能對比測試數據等,此處為保持簡潔僅展示核心框架和關鍵代碼片段)

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女