SpringBoot集成Elasticsearch
一、ElasticSearch是什么?
全文检索,创建Document文档类,包括:创建索引,创建映射,封装数据。
二、代码实现
1.引入依赖
代码如下(示例):
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
2.创建EmpDoc文档
代码如下(示例):
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* 创建索引库、映射(指定类型)、封装数据
*/
@Document(indexName = "pethome",type = "emp")
public class EmpDoc {
@Id
private Long id;
private Integer age;
@Field(type = FieldType.Keyword) // 不分词
private String userName;
@Field(type = FieldType.Text,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
private String intro;
public EmpDoc(Long id, Integer age, String userName, String intro) {
this.id = id;
this.age = age;
this.userName = userName;
this.intro = intro;
}
public EmpDoc() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getIntro() {
return intro;
}
public void setIntro(String intro) {
this.intro = intro;
}
@Override
public String toString() {
return "EmpDoc{" +
"id=" + id +
", age=" + age +
", userName='" + userName + '\'' +
", intro='" + intro + '\'' +
'}';
}
}
3.继承ElasticsearchRepository
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EmpElasticsearchRepository extends ElasticsearchRepository<EmpDoc,Long> {
}
4.业务实现
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Repository;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = EsApp.class)
@Repository
public class EsTest {
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
//通过接口的方式引用代理实现类
@Autowired
EmpElasticsearchRepository empElasticsearchRepository; // 由于我们要CRUD,但是本身没有crud方法
@Test
public void testCreateIndex() {
elasticsearchTemplate.createIndex(EmpDoc.class); // 创建索引库
elasticsearchTemplate.putMapping(EmpDoc.class); // 创建映射
}
/**
* 新增或修改
*/
@Test
public void testSave(){
//empElasticsearchRepository.save(new EmpDoc(4L,12,"小叮当4","今天是个日子"));
empElasticsearchRepository.saveAll(initDoc());
}
/**
* 删除
*/
@Test
public void testDelete(){
empElasticsearchRepository.deleteById(1L);
}
/**
* 查询
*/
@Test
public void testGet(){
//System.out.println(empElasticsearchRepository.findById(2L).get());
Iterable<EmpDoc> all = empElasticsearchRepository.findAll();
all.forEach((EmpDoc)->{
System.out.println(EmpDoc);
});
}
public List<EmpDoc> initDoc(){
ArrayList<EmpDoc> docs = new ArrayList<>(50);
for (int i=0;i<50;i++){
if(i%2==0){
docs.add(new EmpDoc(Long.valueOf(i), 12+i,"小叮当","今天是个日子"+i));
}else{
docs.add(new EmpDoc(Long.valueOf(i), 12+i,"大叮当","今天是个日子"+i));
}
}
return docs;
}
/**
* 高级查询
* 分页:第一页,5条一页
* username="小叮当"
* intro=“好日子”
* 1<age<20
* 倒序
*/
@Test
public void testSearch(){
// 别问
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
// 分页
builder.withPageable(PageRequest.of(0,5));// 0-->从第一页
// 排序 SortMode 有min、max。avg
builder.withSort(new FieldSortBuilder("age").order(SortOrder.DESC));
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();// 源码return new BoolQueryBuilder()
// must
boolQueryBuilder.must(QueryBuilders.matchQuery("intro", "今天是"));
// filter
boolQueryBuilder
.filter(QueryBuilders.termQuery("userName", "小叮当"))
.filter(QueryBuilders.rangeQuery("age").gt(1).lt(20));
builder.withQuery(boolQueryBuilder);
Page<EmpDoc> search = empElasticsearchRepository.search(builder.build());
System.out.println("满足条件的数量:"+search.getTotalElements());
System.out.println("页数:"+search.getTotalPages());
search.getContent().forEach(System.out::println);
}
}
总结
ElasticSearch最基本的使用,学习笔记