[Java實戰]Spring Boot整合Elasticsearch(二十六)
摘要:本文通過完整的實戰演示,詳細講解如何在Spring Boot項目中整合Elasticsearch,實現數據的存儲、檢索和復雜查詢功能。包含版本適配方案、Spring Data Elasticsearch高級特性以及性能優化建議。
一、Elasticsearch核心概念與優勢
1.1 為什么要選擇Elasticsearch?
- 近實時搜索:數據變更后1秒內即可被檢索
- 分布式架構:天然支持水平擴展,輕松應對海量數據
- 全文檢索能力:基于倒排索引,支持模糊查詢、同義詞、分詞等
- 多數據類型:支持結構化、非結構化和地理空間數據
1.2 核心概念解析
概念 | 類比關系型數據庫 | 說明 |
---|---|---|
Index | Database | 數據容器,包含多個文檔類型 |
Type | Table | 7.x版本后已廢棄 |
Document | Row | 數據的基本單元 |
Field | Column | 文檔的字段 |
Shard | 分區 | 索引的橫向拆分單元 |
二、環境準備與版本適配
2.1 組件版本選擇
- Spring Boot 2.7.x
- Elasticsearch 7.10.x
- Spring Data Elasticsearch 4.4.x
<!-- pom.xml 依賴 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.2 配置Elasticsearch連接
# application.yml
spring:elasticsearch:uris: http://localhost:9200username: elasticpassword: your_password
三、實現數據存儲與檢索
3.1 定義領域模型
@Document(indexName = "articles")
public class Article {@Idprivate String id;@Field(type = FieldType.Text)private String title;@Field(type = FieldType.Keyword)private String category;@Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second)private LocalDateTime createTime;
}
3.2 創建Repository接口
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {// 自定義查詢方法List<Article> findByTitleContaining(String keyword);@Query("{\"match\": {\"title\": {\"query\": \"?0\"}}}")Page<Article> searchByTitle(String keyword, Pageable pageable);
}
3.3 基礎CRUD操作示例
@Service
@RequiredArgsConstructor
public class ArticleService {@Autowiredprivate ArticleRepository repository;public void save(Article article) {repository.save(article);}public Page<Article> search(String keyword, int page, int size) {return (Page<Article>) repository.searchByTitle(keyword,PageRequest.of(page, size, Sort.by("createTime").descending()));}
3.4 controller編寫
@RestController
@RequestMapping("/art")
public class ArticleController {@Autowiredprivate ArticleService articleService;//保存數據@PostMapping("/saveArt")public void saveArtInfo(@RequestBody Article art){Article article = new Article();article.setTitle("Spring Boot整合Elasticsearch實戰");article.setCategory("技術文章");article.setCreateTime(LocalDateTime.now());System.out.println("=======保存數據======");articleService.save(article);// 查詢所有文檔//articleService.findAllArticles();}
}
3.5 接口測試
#post請求
http://localhost:8080/art/saveArt
ES中查看數據:
curl -X GET "localhost:9200/articles/_search?pretty"
四、高級查詢實戰
4.1 組合查詢(Bool Query)
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("title", "Spring")).filter(QueryBuilders.rangeQuery("createTime").gte("now-7d/d"));queryBuilder.withQuery(boolQuery);
SearchHits<Article> hits = elasticsearchOperations.search(queryBuilder.build(), Article.class);
4.2 聚合分析示例
TermsAggregationBuilder categoryAgg = AggregationBuilders.terms("category_count").field("category.keyword").size(10);NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().addAggregation(categoryAgg).build();SearchHits<Article> searchHits = elasticsearchOperations.search(searchQuery, Article.class);
Terms terms = searchHits.getAggregations().get("category_count");
五、性能優化建議
-
索引策略優化
- 合理設置分片數(建議每個分片大小在10-50GB)
- 使用別名實現零停機索引切換
-
查詢優化技巧
- 避免深度分頁(推薦使用search_after)
- 使用filter上下文緩存高頻過濾條件
-
硬件配置推薦
- SSD硬盤優先
- JVM堆內存不超過32GB
- 預留50%內存給文件系統緩存
六、常見問題排查
Q1:出現NoNodeAvailableException異常
- 檢查ES集群狀態:
GET _cluster/health
- 驗證網絡連接和防火墻設置
Q2:查詢結果不符合預期
- 使用Analyze API驗證分詞效果:
POST _analyze {"analyzer": "ik_max_word","text": "分布式搜索引擎" }
參考文獻:
- Elasticsearch官方文檔
- Spring Data Elasticsearch官方指南
如果你在使用過程中遇到任何問題,歡迎在評論區留言交流。感謝你的閱讀,希望這篇文章對你有所幫助!