<span>SpringData ElasticSearch整合Elastic Search</span>

SpringData ElasticSearch 整合Elastic Search

1. Spring Data ElasticSearch 介绍

Spring Data Elastic Search 基于Spring data API 简化ElasticSearch操作,将原始操作Elastic Search的客户端API进行封装。Srping Data为Elastic Search项目提供集成搜索引擎。Spring Data Elastic Search POJO的关键功能区域为中心的模型与Elastic Search交互文档和轻松地编写一个存储索引库数据访问层。

官方介绍

2. Spring Data Elastic Search版本比较

官方介绍

3. 环境搭建

3.1 引入依赖

<parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.3.6.RELEASE</version>
        <relativePath/>
</parent>

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

3.2 application.yml增加配置文件

elasticsearch:
  host: 127.0.0.1
  port: 9200  

3.3 ES配置类

@Configuration
@ConfigurationProperties(prefix = "elasticsearch")
@Data
public class ElasticsearchConfiguration extends AbstractElasticsearchConfiguration {
@Override
    public RestHighLevelClient elasticsearchClient() {
        RestClientBuilder builder = RestClient.builder(new HttpHost(host, port));
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);
        return restHighLevelClient;
    }
}

4. ES 索引的操作

4.1 索引创建

    @Test
    public void createIndex(){
        //创建索引,系统初始化会自动创建索引
        System.out.println("创建索引");
    }

4.2 删除索引

    @Test
    public void deleteIndex(){
        boolean delResult = restTemplate.deleteIndex(Product.class);
        log.info("删除索引状态:{}",delResult);
    }

5. 文档的基本操作

引入ProductDao配置

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

5.1 新增文档

    @Test
    public void testSave(){
        Product product =new Product();
        product.setId(2L);
        product.setTitle("华为手机");
        product.setCategory("手机");
        product.setPrice(2999.0);
        product.setImages("http://www.atguigu/hw.jpg");
        productDao.save(product);
    }

5.2 修改文档

    @Test
    public void testUpdate(){
        Product product = new Product();
        product.setId(2L);
        product.setTitle("小米 2 手机");
        product.setCategory("手机");
        product.setPrice(9999.0);
        product.setImages("http://www.atguigu/xm.jpg");
        productDao.save(product);
    }

5.3 根据Id查找文档

    @Test
    public void testFindById(){
        Product product = productDao.findById(2L).get();
        System.out.println(product);
    }

5.4 查询所有文档

    @Test
    public void testFindAll(){
        Iterable<Product> products = productDao.findAll();
        for (Product product : products) {
            System.out.println(product);
        }
    }

5.5 删除文档

    @Test
    public void testDelete(){
        Product product = new Product();
        product.setId(2L);
        productDao.delete(product);
    }

5.6 批量新增文档

    @Test
    public void testBatchSave(){
        List<Product> productList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Product product = new Product();
            product.setId(Long.valueOf(i));
            product.setTitle("["+i+"]小米手机");
            product.setCategory("手机");
            product.setPrice(1999.0+i);
            product.setImages("http://www.atguigu/xm.jpg");
            productList.add(product);
        }
        productDao.saveAll(productList);
    }

5.7 批量删除

    @Test
    public void testBatchDelete(){
        List<Product> productList = new ArrayList<>();
        for(int i=0;i<10;i++){
            Product product =new Product();
            product.setId(Long.valueOf(i));
            productList.add(product);

        }
        productDao.deleteAll(productList);
    }

5.8 分页查询

    @Test
    public void findByPageable(){
        //设置排序(排序方式,正序还是倒序,排序的 id)
        Sort sort = Sort.by(Sort.Direction.ASC,"id");
        int currentPage=0;//当前页,第一页从0开始,1表示第二页
        int pageSize = 5;//每页显示多少条
        //设置查询分页
        PageRequest pageRequest = PageRequest.of(currentPage, pageSize,sort); //分页查询
        Page<Product> productPage = productDao.findAll(pageRequest);
        for (Product Product : productPage.getContent()) {
            System.out.println(Product);
        }
    }

5.9 文档搜索

    @Test
    public void termQuery(){
        // TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category", " 手机");
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category.keyword", "手机");
        Iterable<Product> products = productDao.search(termQueryBuilder);
        for (Product product : products) {
            System.out.println(product);
        }
    }

在使用termQuery的时候,发现QueryBuilders.termQuery("fieldName","vallue") 并没有搜索输出结果。后改成Field.keyword,可以正常搜索出来结果。原因见: es之termQuery精确查询失效问题解决

5.10 分页+搜索文档

    @Test
    public void termQueryByPage(){
        int currentPage= 0 ;
        int pageSize = 5;
        //设置查询分页
        PageRequest pageRequest = PageRequest.of(currentPage, pageSize);
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category.keyword", "手机");
        Iterable<Product> products = productDao.search(termQueryBuilder,pageRequest);
        for (Product product : products) {
            System.out.println(product);
        }
    }	
全部评论

相关推荐

03-02 16:31
已编辑
合肥工业大学 golang
程序员鼠鼠_春招版:学历可以,项目普通,评价多余,奖项没有,如果有面试都是因为学历给你的,我建议可以随便包几个奖项上去,像什么蓝桥杯天梯赛,虽然不一定有用,但是相比acm这种风险小多了,我几段实习下来,压根没查的,第二点是包一段小厂实习,大厂你不好拿捏,小厂打打杂也能让你在26里面出彩一点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务