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.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案例
        
        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(){
        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);
        }
    

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方法,如果id不存在则添加,id存在则先删除再添加

            /**
             * 修改文档数据:先删除再添加,调用的还是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));
            }

原文地址:https://www.cnblogs.com/lowerma/p/12397398.html

时间: 2024-11-07 05:38:10

Spring Data ElasticSearch的使用的相关文章

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

Spring Data ElasticSearch 使用

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

使用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的使用十个小案例

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

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":