SpringBoot整合Spring Data Elasticsearch

简介: Spring Data Elasticsearch提供了ElasticsearchTemplate工具类,实现了POJO与elasticsearch文档之间的映射

Spring Data Elasticsearch提供了ElasticsearchTemplate工具类,实现了POJO与elasticsearch文档之间的映射


elasticsearch本质也是存储数据,它不支持事物,但是它的速度远比数据库快得多,


可以这样来对比elasticsearch和数据库


索引(indices)--------数据库(databases)

类型(type)------------数据表(table)

文档(Document)---------------- 行(row)

字段(Field)-------------------列(Columns )


整合:


  1.在SprinBoot工程中引入jar包


<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>


 2.配置文件


spring.data.elasticsearch.cluster-name=elasticsearch  //名字必须和elasticsearch.yml里面的
cluster.name
相同
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300 
spring.data.elasticsearch.repositories.enabled=true


3.创建实体,并对类和属性进行标注


@Document(indexName = "item",type = "docs", shards = 1, replicas = 0)//标记为文档类型,ndexName:对应索引库名称type:对应在索引库中的类型,shards:分片数量,默认5,replicas:副本数量,默认1
public class Item {
    @Id //主键
    private Long id;
    @Field(type = FieldType.Text, analyzer = "ik_max_word") //标记为成员变量  FieldType,可以是text、long、short、date、integer等  text:存储数据时候,会自动分词,并生成索引  keyword:存储数据时候,不会分词建立索引  analyzer:分词器名称
    private String title; //标题
    @Field(type = FieldType.Keyword)
    private String category;// 分类
    @Field(type = FieldType.Keyword)
    private String brand; // 品牌
    @Field(type = FieldType.Double)
    private Double price; // 价格
    @Field(index = false, type = FieldType.Keyword)//index:是否索引
    private String images; // 图片地址


 4.引入模板ElasticsearchTemplate


   @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;


  5.创建一个索引


     //添加索引
    @Test
    public void addIndex() {
        elasticsearchTemplate.createIndex(Item.class);
    }


   6.删除索引


    //删除索引
    @Test
    public void delete(){
        elasticsearchTemplate.deleteIndex("item");
    }


    7.新增对象


  继承Repository提供的一些子接口,就能具备各种基本的CRUD功能,这里继承ElasticsearchCrudRepository


  首先定义一个对象的接口


public interface ItemRepository extends ElasticsearchCrudRepository<Item,Long> {
}


    然后注入ItemRepository


   @Autowired
    private ItemRepository itemRepository;


    新增对象


    //新增一个对象
    @Test
    public void insert(){
        Item item = new Item(2L,"坚果R1","手机","锤子",2500.00,"http://image.baidu.com/13123.jpg");
        //Order order = new Order(20180020,"菜单");
        itemRepository.save(item);
    }


    批量新增


    //批量新增
    @Test
    public void insertList(){
        List<Item> list = new LinkedList<>();
        list.add(new Item(9L,"华为p20","手机","华为",3500.00,"http://image.baidu.com/13123.jpg"));
        list.add(new Item(10L,"华为p30","手机","华为",5450.00,"http://image.baidu.com/13123.jpg"));
        list.add(new Item(11L,"华为p30 pro","手机","华为",6980.00,"http://image.baidu.com/13123.jpg"));
        itemRepository.saveAll(list);
    }


    8.查询


    //根据字段查询所有
    @Test
    public void queryAll(){
        //升序,相应降序为dscending
        Iterable<Item> items = this.itemRepository.findAll(Sort.by("price").ascending());
        for (Item item : items){
            System.out.println(item);
        }
    }


         9.自定义查询方法


    Spring Data 的另一个强大功能,是根据方法名称自动实现功能,你的方法名叫做:findByTitle,那么它就知道你是根据title查询,然后自动帮你完成,无需写实现类。当然,方法名称要符合一定的约定:



   根据手机名查找手机


    //自定义方法,根据Title查询
    @Test
    public void findByTitle(){
        Item item = this.itemRepository.findByTitle("坚果pro");
        System.out.println(item);
    }


    区间查询


    //根据区间查询
    @Test
    public void queryByPriceBetween(){
        List<Item> list = this.itemRepository.findByPriceBetween(2000.00, 3500.00);
        for (Item item : list) {
            System.out.println("item = " + item);
        }
    }


    模糊查询


     //模糊查询
    @Test
    public void queryLikeTitle(){
        List<Item> list = this.itemRepository.findByTitleLike("R2");
        for (Item item : list){
            System.out.println(item);
        }
    }


    使用自定义方法需要在接口里面申明方法


public interface ItemRepository extends ElasticsearchCrudRepository<Item,Long> {
    Item findByTitle(String title);
    List<Item> findByPriceBetween(double price1, double price2);
    List<Item> findByTitleLike(String title);
}


    10.自定义查询


    //自定义查询,查询数目等
    @Test
    public void matchQuery(){
        // 构建查询条件
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 添加基本分词查询
        queryBuilder.withQuery(QueryBuilders.matchQuery("title","坚果"));
        //获取结果
        Page<Item> items = (Page<Item>) this.itemRepository.findAll();
        //条数
        long total = items.getTotalElements();
        System.out.println("total = "+total);
        for (Item item : items){
            System.out.println(item);
        }
    }
关键的是NativeSearchQueryBuilder这个类


    分页查询


    //分页查询
    @Test
    public void queryByPage(){
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.withQuery(QueryBuilders.termQuery("category","手机"));
        int page = 0;
        int size = 2;
        nativeSearchQueryBuilder.withPageable(PageRequest.of(page,size));
        Page<Item> items = (Page<Item>) this.itemRepository.findAll();
        long total = items.getTotalElements();
        int totalPage = items.getTotalPages();
        int nowPage = items.getNumber();
        int pageSize = items.getSize();
        System.out.println("总条数 = "+total);
        System.out.println("总页数 = "+totalPage);
        System.out.println("当前页 = "+nowPage);
        System.out.println("每页大小 = "+pageSize);
        for (Item item : items){
            System.out.println(item);
        }
    }


   还有很多,就不意义列举


  在elasticsearch-head上查看数据



         关于安装elasticsearch-head,参考:https://www.cnblogs.com/xuwenjin/p/8792919.html

 

  Spring Data Elasticsearch文档:https://docs.spring.io/spring-data/elasticsearch/docs/3.1.10.RELEASE/reference/html/  

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
目录
相关文章
|
8月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
8月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
8月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
737 2
|
9月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
7014 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
924 0
|
Java
【极问系列】springBoot集成elasticsearch出现Unable to parse response body for Response
【极问系列】springBoot集成elasticsearch出现Unable to parse response body for Response
1718 2
|
NoSQL Java 测试技术
SpringBoot集成ElasticSearch在启动时报availableProcessors is already set to [8], rejecting [8]
SpringBoot集成ElasticSearch在启动时报availableProcessors is already set to [8], rejecting [8]
328 0
|
Java
ElasticSearch7入门(六)SpringBoot2.3.0集成ElasticSearch7.5.2-SpringData
ElasticSearch7入门(六)SpringBoot2.3.0集成ElasticSearch7.5.2-SpringData
529 0
|
缓存 自然语言处理 Java
springboot 2.0集成elasticsearch 7.6.2 (集群)关键字高亮显示(下)
springboot 2.0集成elasticsearch 7.6.2 (集群)关键字高亮显示(下)
388 0
|
SQL 自然语言处理 Java
springboot 2.0集成elasticsearch 7.6.2 (集群)关键字高亮显示(上)
springboot 2.0集成elasticsearch 7.6.2 (集群)关键字高亮显示
374 0
springboot 2.0集成elasticsearch 7.6.2 (集群)关键字高亮显示(上)