Spring Data ElasticSearch的使用十个小案例

1、什么是Spring Data

  Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。

2、什么是Spring Data ElasticSearch

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

3.Spring Data ElasticSearch环境  

     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的核心配置文

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd">
    <!--开启包扫描-->
    <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>
    <!--扫描Mapper-->
    <elasticsearch:repositories base-package="com.wdksoft.mapper"/>
</beans>

2.SpringDataES案例
        
        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 添加索引库并且指定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);

                }

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(){
        for(long i=1l;i<=10l;i++){
            Hello hello=new Hello();
            hello.setId(i);
            hello.setTitle("新增的Title数据"+i);
            hello.setContent("新增的Content数据"+i);
            helloService.save(hello);
        }
    

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

5 修改文档数据

  修改也是调用save方法,如果id不存在则添加,id存在则先删除再添加

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

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

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

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

                    }

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

原文地址:https://www.cnblogs.com/danxun/p/12397514.html

时间: 2024-10-03 22:11:11

Spring Data ElasticSearch的使用十个小案例的相关文章

Spring Data ElasticSearch 使用

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

Spring Data ElasticSearch的使用

1.什么是Spring Data Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作.除了CRUD外,还包括如分页.排序等一些常用的功能. 2.什么是Spring Data ElasticSearch Spring Data ElasticSearch 基于 spring data

elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

一.ES Client 简介 1. ES是一个服务,采用C/S结构 2. 回顾 ES的架构 3. ES支持的客户端连接方式 3.1 REST API ,端口 9200 这种连接方式对应于架构图中的RESTful style API这一层,这种客户端的连接方式是RESTful风格的,使用http的方式进行连接 3.2 Transport 连接 端口 9300 这种连接方式对应于架构图中的Transport这一层,这种客户端连接方式是直接连接ES的节点,使用TCP的方式进行连接 4. ES提供了多种

elasticsearch 拼音+ik分词,spring data elasticsearch 拼音分词

elasticsearch 自定义分词器 安装拼音分词器.ik分词器 拼音分词器: https://github.com/medcl/elasticsearch-analysis-pinyin/releases ik分词器:https://github.com/medcl/elasticsearch-analysis-ik/releases 下载源码需要使用maven打包 下载构建好的压缩包解压后放直接在elasticsearch安装目录下 plugins文件夹下,可以重命名 1.在es中设置分

SpringBoot整合Spring Data Elasticsearch

Spring Data Elasticsearch提供了ElasticsearchTemplate工具类,实现了POJO与elasticsearch文档之间的映射 elasticsearch本质也是存储数据,它不支持事物,但是它的速度远比数据库快得多, 可以这样来对比elasticsearch和数据库 索引(indices)--------数据库(databases) 类型(type)------------数据表(table) 文档(Document)---------------- 行(ro

使用JAVA操作ElasticSearch(Java API 和Spring Data ElasticSearch)

Java API 我的ElasticSearch集群的版本是6.2.4,导入elasticsearch相关的maven依赖也是6.2.4,不同版本的api可能会有差异 一:maven依赖 <!--elasticsearch核心依赖--> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version

Spring Data Elasticsearch

项目清单 elasticsearch服务下载包括其中插件和分词 http://download.csdn.net/detail/u014201191/8809619 项目源码 资源文件 app.properties [java] view plain copy print? elasticsearch.esNodes=localhost:9300 elasticsearch.cluster.name=heroscluster app.xml [java] view plain copy prin

Spring data elasticsearch使用

一.准备 1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> 2.application.yml spring: application: name: search-service data: elasti

spring data elasticsearch多索引查询

一次查询多个索引数据 es里可以这样写 GET 索引1,索引2,索引3/_search 也可以这样 给索引创建别名,多个索引可以使用一个别名 POST /_aliases { "actions": [ { "add": { "index": "myindex2", "alias": "myalias" } },{ "add": { "index":