SpringBoot整合Spring Data Elasticsearch基本使用

Elasticsearch是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。

对比关系:

索引库(indices)--------------------------------Databases 数据库

类型(type)-----------------------------Table 数据表

     文档(Document)----------------Row 行

	   字段(Field)-------------------Column 列 

详细说明:

概念 说明
索引库(indices) indices是index的复数,代表许多的索引,
类型(type) 类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此未来版本中会移除这个概念
文档(document) 存入索引库原始的数据。比如每一条商品信息,就是一个文档
字段(field) 文档中的属性
映射配置(mappings) 字段的数据类型、属性、是否索引、是否存储等特性

是不是与Lucene中的概念类似。

另外,在Elasticsearch有一些集群相关的概念:

  • 索引集(Indices,index的复数):逻辑上的完整索引
  • 分片(shard):数据拆分后的各个部分
  • 副本(replica):每个分片的复制

要注意的是:Elasticsearch本身就是分布式的,因此即便你只有一个节点,Elasticsearch默认也会对你的数据进行分片和副本操作,当你向集群添加新数据时,数据也会在新加入的节点中进行平衡(负载均衡)。

原生java整合elasticsearch的API地址:(类似JDBC)

https://www.elastic.co/guide/en/elasticsearch/client/java-api/6.2/java-docs.html

Elasticsearch提供的Java客户端有一些不太方便的地方:

  • 很多地方需要拼接Json字符串,在java中拼接字符串有多恐怖你应该懂的
  • 需要自己把对象序列化为json存储
  • 查询到结果也需要自己反序列化为对象

因此,为了方便,用Spring提供的套件:Spring Data Elasticsearch

1.简介

Spring Data Elasticsearch是Spring Data项目下的一个子模块。

扫描二维码关注公众号,回复: 4629711 查看本文章

查看 Spring Data的官网:http://projects.spring.io/spring-data/

在这里插入图片描述

Spring Data 是的使命是给各种数据访问提供统一的编程接口,不管是关系型数据库(如MySQL),还是非关系数据库(如Redis),或者类似Elasticsearch这样的索引数据库。从而简化开发人员的代码,提高开发效率。

包含很多不同数据操作的模块:

在这里插入图片描述

Spring Data Elasticsearch的页面:https://projects.spring.io/spring-data-elasticsearch/
在这里插入图片描述

特征:

  • 支持Spring的基于@Configuration的java配置方式,或者XML配置方式
  • 提供了用于操作ES的便捷工具类**ElasticsearchTemplate**。包括实现文档到POJO之间的自动智能映射。
  • 利用Spring的数据转换服务实现的功能丰富的对象映射
  • 基于注解的元数据映射方式,而且可扩展以支持更多不同的数据格式
  • 根据持久层接口自动生成对应实现方法,无需人工编写基本操作代码(类似mybatis,根据接口自动得到实现)。当然,也支持人工定制查询

1.2.创建Demo工程

我用脚本创建的
在这里插入图片描述

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

application.yml文件配置:
在这里插入图片描述

1.3.索引操作

1.3.1.创建索引和映射

SpringBoot-data-elasticsearch提供了面向对象的方式操作elasticsearch

业务:将商品的信息存入elasticsearch,并且执行搜索操作

映射—注解

创建一个商品对象,有这些属性:

答:id 编号,title 标题,category 分类,brand 品牌,price 价格, 图片地址

在SpringDataElasticSearch中,只需要操作对象,就可以操作elasticsearch中的数据

Spring Data通过注解来声明字段的映射属性,有下面的三个注解:

  • @Document 作用在类,标记实体类为文档对象,一般有两个属性
    • indexName:对应索引库名称
    • type:对应在索引库中的类型
    • shards:分片数量,默认5
    • replicas:副本数量,默认1
  • @Id 作用在成员变量,标记一个字段作为id主键
  • @Field 作用在成员变量,标记为文档的字段,并指定字段映射属性:
    • type:字段类型,是枚举:FieldType,可以是text、long、short、date、integer、object等
      • text:存储数据时候,会自动分词,并生成索引
      • keyword:存储数据时候,不会分词建立索引
      • Numerical:数值类型,分两类
        • 基本数据类型:long、interger、short、byte、double、float、half_float
        • 浮点数的高精度类型:scaled_float
          • 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
      • Date:日期类型
        • elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。
    • index:是否索引,布尔类型,默认是true
    • store:是否存储,布尔类型,默认是false
    • analyzer:分词器名称,这里的ik_max_word即使用ik分词器

实体类

首先我们准备好实体类:

   /**
     * indexName="索引库的名字"
     * type:表名
     * shards:分片的数量,elasticsearch自动集群,默认一个数据放6个地方
     * replicas:隐藏的一个分片
     */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "zch",type = "zch", shards = 1, replicas = 0)

public class zch {

    @Id
    private Long id;

    @Field(type = FieldType.text, analyzer = "ik_max_word")
    private String title; //标题

    @Field(type = FieldType.keyword)
    private String category;// 分类

    @Field(type = FieldType.keyword)
    private String brand; // 品牌

    @Field(type = FieldType.Double)
    private Double price; // 价格

    @Field(index = false, type = FieldType.keyword)
    private String images; // 图片地址


}

创建索引

ElasticsearchTemplate中提供了创建索引的API:

在这里插入图片描述

  • 可以根据类的信息自动生成,也可以手动指定indexName和Settings

在这里插入图片描述

映射相关的API:

在这里插入图片描述

在这里插入图片描述

索引信息:
在这里插入图片描述

1.3.2.删除索引

删除索引的API:
可以根据类名或索引名删除。
在这里插入图片描述

1.4.新增文档数据

1.4.1.Repository接口

Spring Data 的强大之处,就在于你不用写任何DAO处理,自动根据方法名或类的信息进行CRUD操作。只要你定义一个接口,然后继承Repository提供的一些子接口,就能具备各种基本的CRUD功能。

来看下Repository的继承关系:

在这里插入图片描述
我们看到有一个ElasticsearchCrudRepository接口:
在这里插入图片描述
所以,我们只需要定义接口,然后继承它就OK了。
在这里插入图片描述

接下来,我们测试新增数据:

1.4.2.新增一个对象

在这里插入图片描述

1.4.4.修改

elasticsearch中本没有修改,它是先删除再新增

修改和新增是同一个接口,区分的依据就是id。

猜你喜欢

转载自blog.csdn.net/fhkkkbfgggjk/article/details/85166375