Spring Boot2.3.2 整合Elasticsearch 7.2 完成增删改查

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类和自己扩展自定义方法的类

常用自定义查询规则,完整查询规则官网有文档
关键字命名规则解释示例
andfindByField1AndField2根据Field1和Field2获得数据findByTitleAndContent
orfindByField1OrField2 根据Field1或Field2获得数据findByTitleOrContent
is findByField根据Field获得数据findByTitle
notfindByFieldNot 根据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交流

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值