Spring Boot2.3.2 整合Elasticsearch 7.2 完成增删改查
话不多说,直接上代码,基本上涉及es的地方都写了注释了,配合kibana查看更加方便一些,前面有安装es和kibana IK分词器的文章
pom.xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- es全文检索 -->
<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>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
application.yml
spring:
elasticsearch:
rest:
uris: 192.168.109.130:9200
username: esuser
password: root
尽量也按照分层思想开发,养成好习惯
entity类,对应存储es中的数据结构,需要安装Lombok插件
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
//对应es中的索引名称,es7已经没有type了
@Document(indexName = "es_entity")
public class EsEntity {
//Field Type有很多数据类型,根据字段选择什么类型即可,源码里列举了所有类型
//es7 默认不设置index = false的话默认都会创建索引
@Field(type = FieldType.Keyword)
private String id;
//字符串,最大程度拆分
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String name;
//数字
@Field(type = FieldType.Integer)
private Integer age;
}
dao层,一般用于继承ElasticsearchRepository类和自己扩展自定义方法的类
常用自定义查询规则,完整查询规则官网有文档关键字 | 命名规则 | 解释 | 示例 |
and | findByField1AndField2 | 根据Field1和Field2获得数据 | findByTitleAndContent |
or | findByField1OrField2 | 根据Field1或Field2获得数据 | findByTitleOrContent |
is | findByField | 根据Field获得数据 | findByTitle |
not | findByFieldNot | 根据Field获得补集数据 | findByTitleNot |
between | findByFieldBetween | 获得指定范围的数据 | findByPriceBetween |
lessThanEqual | findByFieldLessThan | 获得小于等于指定值的数据 | findByPriceLessThan |
/**
* ElasticsearchRepository<T , ID> 对应实体和ID的数据类型
* 下面扩展了几个常用的方法,其他也是举一反三,大同小异
*/
public interface EsRepository extends ElasticsearchRepository<EsEntity, String> {
/**
* 根据ID查询
* @param id
* @return
*/
EsEntity findEsEntityById(String id);
/**
* 查询索引下所有包含这个名字的数据
* @param name
* @return
*/
List<EsEntity> findEsEntityByName(String name);
/**
* 根据ID删除数据
* @param id
*/
void deleteEsEntityById(String id);
/**
* 区间查询
* @param age1
* @param age2
* @return
*/
List<EsEntity> findByAgeBetween(Integer age1,Integer age2);
}
Service接口层
public interface EsServiceI {
/**
* 保存
* @param docBean
*/
void save(EsEntity docBean);
/**
* 批量保存
* @param list
*/
void saveAll(List<EsEntity> list);
/**
* 查询全部
* @return
*/
Iterator<EsEntity> findAll();
/**
* 根据ID查询
* @param id
* @return
*/
EsEntity findEsEntityById(String id);
/**
* 查询索引下所有包含这个名字的数据
* @param name
* @return
*/
List<EsEntity> findEsEntityByName(String name);
/**
* 根据ID删除数据
* @param id
*/
void deleteEsEntityById(String id);
/**
* 区间查询
* @param age1
* @param age2
* @return
*/
List<EsEntity> findByAgeBetween(Integer age1,Integer age2);
}
Service实现类层,一般此层做一些业务处理
@Service
public class EsServiceIImpl implements EsServiceI {
@Autowired
private EsRepository esRepository;
@Override
public void save(EsEntity docBean) {
esRepository.save(docBean);
}
@Override
public void saveAll(List<EsEntity> list) {
esRepository.saveAll(list);
}
@Override
public Iterator<EsEntity> findAll() {
return esRepository.findAll().iterator();
}
@Override
public EsEntity findEsEntityById(String id) {
return esRepository.findEsEntityById(id);
}
@Override
public List<EsEntity> findEsEntityByName(String name) {
return esRepository.findEsEntityByName(name);
}
@Override
public void deleteEsEntityById(String id) {
esRepository.deleteEsEntityById(id);
}
@Override
public List<EsEntity> findByAgeBetween(Integer age1,Integer age2) {
return esRepository.findByAgeBetween(age1, age2);
}
}
controller层用Test替代测试,里面常用的增删改查都有了,一般项目中也就对一些常用数据缓存到es中进行全文检索查询
@RunWith(SpringRunner.class)
@SpringBootTest
public class es {
@Autowired
private EsServiceI elasticService;
/**
* es 添加
*
* @throws IOException
*/
@Test
public void save() throws IOException {
//单条保存
elasticService.save(new EsEntity(UUID.randomUUID().toString(), "张三1", 18));
List<EsEntity> list = new ArrayList<>();
Collections.addAll(list, new EsEntity(UUID.randomUUID().toString(), "张三", 18)
, new EsEntity(UUID.randomUUID().toString(), "李四", 26)
, new EsEntity(UUID.randomUUID().toString(), "王麻子", 23));
//批量保存
elasticService.saveAll(list);
}
/**
* es 查询
* @throws IOException
*/
@Test
public void search() throws IOException {
EsEntity entity = elasticService.findEsEntityById("f1a2d9d5-0b8b-43a8-bd69-b6585e3cfdc0");
System.out.println("ByID查询:" + entity.getName());
List<EsEntity> esEntities = elasticService.findEsEntityByName("张三");
System.out.println("查询索引下包含张三名称的数据:" + esEntities.size());
List<EsEntity> ageBetween = elasticService.findByAgeBetween(18, 24);
System.out.println("18岁到24岁的数据:"+ageBetween.size());
//查询索引下所有数据
Iterator<EsEntity> iterator = elasticService.findAll();
while (iterator.hasNext()) {
System.out.println("循环查询所有数据姓名:"+iterator.next().getName());
}
}
/**
* es 删除
*/
@Test
public void delete(){
elasticService.deleteEsEntityById("c73474cc-669b-4ba4-ad4f-740c001793df");
}
}
放几张kibana中查询结果图,如果没有kibana用接口查询也是一样的
在网上找了几篇文档,看完之后还是知其然不知其所以然,所以自己抽了点时间写了一篇,如果对你有帮助,点赞评论支持一下,有问题可以加QQ:648267940交流