Spring Boot整合ElasticSearch
准备
依赖
1 2 3 4 5
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <version>2.3.6.RELEASE</version> </dependency>
|
版本对应很重要,下面是版本对应关系,我的elasticsearch是7.X的,所以用2.3.x的springboot
参考地址

配置
1 2 3 4 5
| spring.data.elasticsearch.repositories.enabled=true spring.elasticsearch.rest.uris=127.0.0.1:9200 #ES默认只支持通过127.0.0.1访问 spring.elasticsearch.rest.username=elastic spring.elasticsearch.rest.password=123456
|
CRUD
spring boot将基本的增删改查已经封装好了,只需定义entity和mapper即可
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
| @Data @NoArgsConstructor @AllArgsConstructor
@Document(indexName = "article", createIndex = true) public class EsArticle {
@Id @Field(type = FieldType.Keyword) private String articleId;
@Field(type = FieldType.Text, analyzer = "ik_smart") private String title;
@Field(type = FieldType.Keyword) private String classification;
@Field(type = FieldType.Keyword) private List<String> tags;
@Field(type = FieldType.Text, analyzer = "ik_smart") private String content;
@Field(type = FieldType.Date, format = DateFormat.custom,pattern ="yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date inputDate; }
|
1 2 3
| public interface EsArticleMapper extends ElasticsearchRepository<EsArticle, String> {
}
|
//注:引入EsArticleMapper类就可以使用增删改查等基本操作了
自定义查询
在实际操作中,普通的查询肯定无法满足我们的需求,spring boot提供了三种自定义查询的方式
根据方法名
这种方式有点类似jpa,既根据列名以及特定的组合词语达到自定义的效果
参考地址

手写查询语句
该方式是利用@Query接口实现自定义语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public interface EsArticleMapper extends ElasticsearchRepository<EsArticle, String> {
@Query("{\n" + " \"bool\": {\n" + " \"must\": [\n" + " {\n" + " \"match\": {\n" + " \"title\": \"?0\"\n" + " }\n" + " },\n" + " {\n" + " \"match\": {\n" + " \"content\": \"?1\"\n" + " }\n" + " }\n" + " ]\n" + " }\n" + "}") Page<EsArticle> query(String title, String content, Pageable pageable);
}
|
//注:这里的Pageable 和 Page是为了实现分页的效果,@Query中的语句是query下级语句,不包括query,否则会报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @Component public class EsArticleQuery {
@Autowired private EsArticleMapper esArticleMapper;
public PageResult queryByTitleAndContent(String title, String content) throws IOException { PageResult pageResult = PageResult.init(); Pageable pageable = PageRequest.of(pageResult.getPage(), pageResult.getRows()); Page<EsArticle> esArticlePage = esArticleMapper.query(title, content, pageable); pageResult.setTotal(esArticlePage.getTotalElements()); pageResult.setData(esArticlePage.getContent()); return pageResult; }
}
|
使用RestHighLevelClient
RestHighLevelClient的功能非常强大,可以通过各种方法和类实现自定义的效果,甚至可以自定义删除与更新
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
| @Component public class EsArticleQuery {
@Autowired private RestHighLevelClient client;
public PageResult queryByTitleAndContent(String title, String content) throws IOException { PageResult pageResult = PageResult.init(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(QueryBuilders.matchQuery("title", title)); boolQueryBuilder.must(QueryBuilders.matchQuery("content", content)); SearchRequest searchRequest = new SearchRequest("article"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().query(boolQueryBuilder); searchSourceBuilder.from(pageResult.getFrom()); searchSourceBuilder.size(pageResult.getRows()); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); SearchHit[] hits = searchResponse.getHits().getHits(); List<EsArticle> esArticleList = Arrays.stream(hits).map(hit -> JSONUtil.toBean(hit.getSourceAsString(), EsArticle.class)).collect(Collectors.toList()); pageResult.setTotal(searchResponse.getHits().getTotalHits().value); pageResult.setData(esArticleList); return pageResult; }
}
|
//注:这里与方法二手写查询语句是一样的效果,可对比观察
备注1:方法二与方法三的完整语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| { "query": { "bool": { "must": [ { "match": { "title": "Spring" } },{ "match":{ "content":"Spring" } } ] } }, "from":0, "size":10 }
|
自定义聚合查询
自定义聚合查询只是在上述三种方法稍微改进一下,不在过多阐述