zoukankan      html  css  js  c++  java
  • SpringDataES讲解

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

    1.1 环境搭建
    步骤一:Spring-Data-ElasticSearch,Spring-test帮助你加载配置文件并且测试
    ESTemplate模板,模板当中包含了一系列的方法

    <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>3.1.9.RELEASE</version>
    <exclusions>
    <exclusion>
    <groupId>org.elasticsearch.plugin</groupId>
    <artifactId>transport‐netty4‐client</artifactId>
    </exclusion>
    </exclusions>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.1.5.RELEASE</version>
    <scope>test</scope>
    </dependency>


    步骤二:创建Spring的核心配置文件

    <!--开启包扫描-->
    <context:component-scan base-package="com.wdksoft"/>
    <!--配置集群信息-->
    <elasticsearch:transport-client id="esClient" cluster-name="my-elasticsearch" cluster-nodes="127.0.0.1:9300,127.0.0.1:9301,127.0.0.1:9302"/>
    <!--注入ESTemplate模板-->
    <bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
    <constructor-arg name="client" ref="esClient"/>
    </bean>


    2.SpringDataES案例

    2.1 添加索引库

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:applicationContext.xml")
    public class SpringDataESTest {
    //植入模板对象
    @Resource
    private ElasticsearchTemplate elasticsearchTemplate;
    
    @Test
    public void createIndex(){
    //创建空的索引库
    elasticsearchTemplate.createIndex(Hello.class);
    
    }
    }

    2.2 添加索引库并且指定Mapping信息
    利用POJO映射Mapping信息

    @Document(indexName = "my-index",type = "hello")
    public class Hello {
    @Id
    @Field(type = FieldType.Long,index = false,store = true)
    private Long id;
    @Field(type = FieldType.Text,index = true,store = true,analyzer = "ik_max_word")
    private String title;
    @Field(type = FieldType.Text,index = true,store = true,analyzer = "ik_max_word")
    private String content;
    }
    @Test
    public void createIndex(){
    //创建空的索引库
    elasticsearchTemplate.+(Hello.class);
    elasticsearchTemplate.putMapping(Hello.class);
    
    }


    2.3 添加文档数据
    创建Mapper层接口:

    /**
    * 数据访问层接口
    */
    @Repository
    public interface HelloMapper extends ElasticsearchRepository<Hello,Long> {
    }
    创建Service层接口
    public interface HelloService {
    public void save(Hello hello);
    }
    创建Service层接口实现类
    @Service("helloService")
    public class HelloServiceImpl implements HelloService {
    //植入Mapper层对象
    @Resource
    private HelloMapper helloMapper;
    
    @Override
    public void save(Hello hello) {
    helloMapper.save(hello);
    }
    }
    测试:
    /**
    * 添加文档数据
    */
    @Test
    public void createDocument(){
    Hello hello=new Hello();
    hello.setId(1l);
    hello.setTitle("新增的Title数据");
    hello.setContent("新增的Content数据");
    helloService.save(hello);
    
    }

    2.4 删除文档数据

    Service层接口

    //根据文档ID删除
    public void deleteById(long id);
    //删除全部
    public void deleteAll();
    Service层接口实现类
    @Override
    public void deleteById(long id) {
    helloMapper.deleteById(id);
    }
    
    @Override
    public void deleteAll() {
    helloMapper.deleteAll();
    }

    测试:

    /**
    * 删除文档数据
    */
    @Test
    public void deleteDocument(){
    //根据文档ID删除
    helloService.deleteById(1l);
    //全部删除
    helloService.deleteAll();
    }


    2.5 修改文档数据

    /**
    * 修改文档数据:先删除再修改,调用的还是save方法
    */
    @Test
    public void updateDocument(){
    Hello hello=new Hello();
    hello.setId(1l);
    hello.setTitle("[修改]新增的Title数据");
    hello.setContent("[修改]新增的Content数据");
    helloService.save(hello);
    }


    2.6 根据ID查询
    Service层接口

    //根据文档ID查询数据
    public Optional<Hello> findById(Long id);
    Service层接口实现类
    @Override
    public Optional<Hello> findById(Long id) {
    return helloMapper.findById(id);
    }
    测试:
    /**
    * 根据文档ID查询
    */
    @Test
    public void getDocumentById(){
    Optional<Hello> optional = helloService.findById(2l);
    Hello hello = optional.get();
    System.out.println(hello);
    }

    2.7 查询全部文档数据
    Service层接口

    //查询所有数据
    public Iterable<Hello> findAll();
    //查询所有数据包含分页
    public Page<Hello> findAll(Pageable pageable);
    Service层接口实现类
    @Override
    public Iterable<Hello> findAll() {
    return helloMapper.findAll();
    }
    
    @Override
    public Page<Hello> findAll(Pageable pageable) {
    return helloMapper.findAll(pageable);
    }

    测试:

    /**
    * 查询所有文档数据
    */
    @Test
    public void getAllDocument(){
    Iterable<Hello> iterable = helloService.findAll();
    iterable.forEach(item-> System.out.println(item));
    }
    /**
    * 查询所有文档数据加分页
    */
    @Test
    public void getDocumentPage(){
    //指定分页规则
    Page<Hello> page = helloService.findAll(PageRequest.of(0, 5));
    for (Hello hello:page.getContent()) {
    System.out.println(hello);
    }
    }


    2.8 根据查询方法的自定义规则进行数据查询
    根据Title域进行查询,并且加分页
    Mapper层接口:

    /**
    * 数据访问层接口
    */
    @Repository
    public interface HelloMapper extends ElasticsearchRepository<Hello,Long> {
    //根据Title域中的关键词查找数据
    public List<Hello> findByTitle(String str);
    //根据Title域中的关键词查找数据
    public List<Hello> findByTitle(String str, Pageable pageable);
    }
    Service层接口
    //根据Title域中的关键词查找数据
    public List<Hello> findByTitle(String str);
    //根据Title域中的关键词查找数据
    public List<Hello> findByTitle(String str, Pageable pageable);
    Service层接口实现类
    @Override
    public List<Hello> findByTitle(String str) {
    return helloMapper.findByTitle(str);
    }
    
    @Override
    public List<Hello> findByTitle(String str, Pageable pageable) {
    return helloMapper.findByTitle(str,pageable);
    }

    测试: 

    /**
    * 查询所有文档数据加分页
    */
    @Test
    public void getDocumentByTitle(){
    /*List<Hello> helloLists = helloService.findByTitle("修改");
    helloLists.stream().forEach(item-> System.out.println(item));*/
    
    List<Hello> helloLists = helloService.findByTitle("新增", PageRequest.of(0, 5));
    helloLists.stream().forEach(item-> System.out.println(item));
    
    }

    2.9 NativeSearchQuery

    /**
    * 根据一段内容查询数据:NativeSearchQuery
    */
    @Test
    public void getDocumentQuery(){
    //创建NativeSearchQueryBuilder对象
    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
    //指定查询规则
    NativeSearchQuery build = nativeSearchQueryBuilder.withQuery(QueryBuilders.queryStringQuery("搜索新增").defaultField("title"))
    .withPageable(PageRequest.of(0,5)).build();
    //使用ESTemplates执行查询
    List<Hello> hellos = elasticsearchTemplate.queryForList(build, Hello.class);
    hellos.stream().forEach(item-> System.out.println(item));
    }


  • 相关阅读:
    MySQL约束笔记
    MySQL 存储过程入门
    数据库范式
    Hibernate 懒加载 错误----no session
    复选框 checkbox 选中事件
    Hibernate 三种状态变化 与 sql 语句的关系
    Spring 4 + Hibernate 4 下 getCurrentSession()的使用情况
    35个java代码性能优化总结
    为什么 Java中1000==1000为false而100==100为true?AND "2+2=5"?
    MyBatis对象关联关系----多对多的保存与查询
  • 原文地址:https://www.cnblogs.com/rzbwyj/p/12396297.html
Copyright © 2011-2022 走看看