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项目下的一个子模块。
查看 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分词器
- type:字段类型,是枚举:FieldType,可以是text、long、short、date、integer、object等
实体类
首先我们准备好实体类:
/**
* 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。