Spring Data Elasticsearch集成

四、Spring Data Elasticsearch集成

  • Spring Data Elasticsearch 基于 spring data API 简化 Elasticsearch 操作,将原始操作Elasticsearch 的客户端 API 进行封装 。Spring Data 为 Elasticsearch 项目提供集成搜索引擎。Spring Data Elasticsearch POJO 的关键功能区域为中心的模型与 Elastichsearch 交互文档和轻松地编写一个存储索引库数据访问层。
  • 官方网站: https://spring.io/projects/spring-data-elasticsearch

1、创建Springboot项目

2、导入相应依赖

  • <properties>
           <java.version>1.8</java.version>
           <elasticsearch.version>7.8.0</elasticsearch.version>
       </properties>
       <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-web</artifactId>
           </dependency>
      
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-devtools</artifactId>
               <scope>runtime</scope>
               <optional>true</optional>
           </dependency>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-configuration-processor</artifactId>
               <optional>true</optional>
           </dependency>
           <dependency>
               <groupId>org.projectlombok</groupId>
               <artifactId>lombok</artifactId>
               <optional>true</optional>
           </dependency>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-test</artifactId>
               <scope>test</scope>
           </dependency>
       </dependencies>
    

3、编写 application.properties 配置文件

  • elasticsearch.host=127.0.0.1
    
    elasticsearch.port=9200
    

4、编写实体类

  • @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    public class Student {
        //商品唯一标识id
        private Long id;
        //商品名称
        private String name;
        //分类名称
        private String sex;
        //商品价格
        private Integer age;
    
    }
    

5、编写配置类

  • ElasticsearchRestTemplate 是 spring-data-elasticsearch 项目中的一个类,和其他 spring 项目中的 template类似。

  • ElasticsearchRestTemplate 基 于 RestHighLevelClient 客户端的。需要自定义配置类,继承 AbstractElasticsearchConfiguration,并实现 elasticsearchClient()抽象方法,创建 RestHighLevelClient 对象。

  • @ConfigurationProperties(prefix = "elasticsearch")
    @Configuration
    @Data
    public class ElasticsearchConfig  extends AbstractElasticsearchConfiguration {
        private String host;
        private Integer port;
        
        @Override
        public RestHighLevelClient elasticsearchClient() {
            RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                            new HttpHost(host, port)
                    )
            );
            return client;
        }
    }
    

6、编写DAO数据访问对象

  • @Repository
    public interface ProductDao extends ElasticsearchRepository<Student,Long> {
        
    }
    

7、实体类映射Es操作

  • @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Document(indexName = "student", shards = 3, replicas = 1)
    public class Student {
        //必须有 id,这里的 id 是全局唯一的标识,等同于 es 中的"_id"
        @Id
        private Integer id;//商品唯一标识
        /**
         * type : 字段数据类型
         * analyzer : 分词器类型
         * index : 是否索引(默认:true)
         * Keyword : 短语,不进行分词
         */
        @Field(type = FieldType.Text, analyzer = "ik_max_word")
        private String name;//商品名称
        @Field(type = FieldType.Keyword)
        private String sex;//分类名称
        @Field(type = FieldType.Integer)
        private Double age;//商品价格
    }
    

8、索引操作

  • @SpringBootTest
    @RunWith(SpringRunner.class)
    class EsSpringdataApplicationTests {
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 启动会默认创建索引,跟实体类映射配置有关
         */
        @Test
        public void createIndices(){
            System.out.println("创建索引");
        }
    
        /**
         * 删除索引
         * @throws IOException
         */
        @Test
        public void deleteIndices() throws IOException {
            //删除索引-请求对象
            DeleteIndexRequest request = new DeleteIndexRequest("user");
            //发送请求,获得响应
            AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
            //操作结果
            System.out.println("操作结果 = " + response.isAcknowledged());
        }
    
    }
    

9、文档操作

  • @SpringBootTest
    @RunWith(SpringRunner.class)
    class EsSpringdataApplicationTests {
    
        @Autowired
        private RestHighLevelClient client;
    
        @Autowired
        private StudentDao studentDao;
    
    
        /**
         * 新增文档
         */
        @Test
        public void addDocument(){
            Student student = new Student(2, "李四", "男", 13);
            studentDao.save(student);
        }
    
        /**
         * 更新文档
         */
        @Test
        public void updateDocument(){
            Student student = new Student(1, "张三", "女", 18);
            studentDao.save(student);
        }
    
        /**
         * 查询文档
         */
        @Test
        public void getDocumentById(){
            Student student = studentDao.findById(1).get();
            System.out.println(student);
        }
    
        /**
         * 查询索引文档
         */
        @Test
        public void getAllDocument(){
            Iterable<Student> students = studentDao.findAll();
            for (Student student : students) {
                System.out.println(student);
            }
        }
    
        /**
         * 删除文档
         */
        @Test
        public void deleteDocument(){
            Student student = new Student();
            student.setId(1);
            studentDao.delete(student);
        }
    
        /**
         * 批量增加
         */
        @Test
        public void bulkAddDocument(){
            List<Student> students = new ArrayList<>();
            for(int i = 0; i < 10 ; i++){
                Student student = new Student(Integer.valueOf(i), "张三" + i, "男", 20+i);
                students.add(student);
            }
            studentDao.saveAll(students);
        }
    
        /**
         * 分页和排序
         */
        @Test
        public void pageAndSort(){
            //设置排序(排序方式,正序还是倒序,排序的age)
            Sort sort = Sort.by(Sort.Direction.DESC, "age");
            //当前页,第一页从 0 开始,1 表示第二页
            int currentPage = 0;
            //每页显示多少条
            int pageSize = 5;
            //设置查询分页
            PageRequest pageRequest = PageRequest.of(currentPage, pageSize, sort);
            //分页查询
            Page<Student> studentPage = studentDao.findAll(pageRequest);
            for (Student student : studentPage.getContent()) {
                System.out.println(student);
            }
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值