• SpringBoot整合Spring Data 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/  

    生命不止,折腾不息
  • 相关阅读:
    编译原理
    C++的RTTI
    静态加载dll的问题
    COM编程中的接口查询QueryInterface的实现原理
    com学习笔记(2)基本的com接口QueryInterface的实现
    如何从DLL中生成LIB文件
    CMAP原理及其在MFC中的实现(MAP模板没有顺序遍历的功能)
    多态性vptrvtable
    技术网站
    垃圾事务
  • 原文地址:https://www.cnblogs.com/steakliu/p/11553199.html
Copyright © 2020-2023  润新知