SpringData ElasticSearch整合Elastic Search

摘要:
SrpingData为ElasticSearch项目提供了一个集成的搜索引擎。
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交互文档和轻松地编写一个存储索引库数据访问层。

官方介绍

image-20211104170607219

2. Spring Data Elastic Search版本比较

image-20211104170800061

官方介绍

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>

image-20211104172032662

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);
        }
    }	

免责声明:文章转载自《SpringData ElasticSearch整合Elastic Search》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vivo 云服务海量数据存储架构演进与实践在Dialog中添加工具条下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

yml配置从nacos配置中心取数据(单个或多个),读读源码,寻找如何配置多个

更详细或者其他配置方法,可以参考这位大佬的博客:Nacos配置管理及动态刷新 1. 读取单个文件 spring: cloud: nacos: config: server-addr: localhost:8848 namespace: **********下面的配置文件必须在此命名空间下...

php的session

来源:http://blog.163.com/lgh_2002/blog/static/4401752620105246517509/ http协议是WEB服务器与客户 端(浏览器)相互通信的协议,它是一种无状态协议。所谓无状态,指的是不会维护http请求数据,http请求是独立的,非持久的。而越来越复杂的WEB 应用,需要保存一些用户状态信息。这时候,S...

解决 Visual Studio For Mac 还原包失败问题

体验了一把改名部最新的杰作,总体感觉挺好,也能看出微软在跨平台这方面所做出的努力。 可能是预览版的缘故,还是遇到一个比较大的问题,创建netcore项目后,依赖包还原失败,错误信息如下: 可以先试着手动还原一下(说不定就成功了呢,反正我没成功) dotnet restore 如果不成功,那就按照我的做法一步一步来。 1.查看 dotnetcore sdk...

sqlserver 新建只读权限用户

1,新建只能访问某一个表的只读用户。 --添加只允许访问指定表的用户:execsp_addlogin'用户名','密码','默认数据库名'--添加到数据库execsp_grantdbaccess'用户名'--分配SELECT整表权限GRANTSELECTON表名TO[用户名]--分配SELECT权限到具体的列GRANTSELECTON表名(id,AA)TO...

TestNG入门——注解之Before/After

注解是java 5新增的功能,可使用于类,方法,变量,testNG包提供的注解功能请见下表 1、@BeforeSuite or @AfterSuite  被注解的方法,将在整个测试套件之前 or 之后执行。 2、@BeforeTest or @AfterTest 被注解的方法,将在测试套件内所有用例执行之前 or 之后执行。 3、@BeforeGroups...

hive QL 插入语法

1.insert 语法格式为:基本的插入语法:INSERT OVERWRITE TABLE tablename [PARTITON(partcol1=val1,partclo2=val2)]select_statement FROM from_statementinsert overwrite table test_insert select * from...