准备

依赖

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
#开启 Elasticsearch 仓库
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即可

  • entity
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
//注:createIndex为true时,若此索引不存在,则新建索引,并且还可以修改索引,@Document为索引的属性,下面的@Field就是映射的属性
@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;
}
  • mapper
1
2
3
public interface EsArticleMapper extends ElasticsearchRepository<EsArticle, String> {

}

//注:引入EsArticleMapper类就可以使用增删改查等基本操作了

自定义查询

在实际操作中,普通的查询肯定无法满足我们的需求,spring boot提供了三种自定义查询的方式

根据方法名

这种方式有点类似jpa,既根据列名以及特定的组合词语达到自定义的效果
参考地址

手写查询语句

该方式是利用@Query接口实现自定义语句

  • mapper
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,否则会报错

  • Service
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的功能非常强大,可以通过各种方法和类实现自定义的效果,甚至可以自定义删除与更新

  • Service
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
}

自定义聚合查询

自定义聚合查询只是在上述三种方法稍微改进一下,不在过多阐述


本站总访问量:次本站总访问数:人
本站由 Peng Tong 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。