什么是spring data框架
Spring Data是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持 map-reduce框架和云计算数据服务。Spring Data可以极大的简化JPA(Elasticsearch…)的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD 外,还包括如分页、排序等一些常用的功能。
Spring Data Elasticsearch 介绍
Spring Data Elasticsearch基于Spring Data API简化 Elasticsearch 操作,将原始操作Elasticsearch 的客户端API进行封装。Spring Data为Elasticsearch 项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储索引库数据访问层
java如何使用呢
第一步加pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
第二步在配置文件中application.properties
第三步创建es配置类
需要继承一个AbstractElasticsearchConfiguration他是一个抽象类,并重写里面的elasticsearchClient方法,这个是方法是用来连接es的客户端的
其中
@Configuration 声明是一个配置类
@ConfigurationProperties(prefix = "elasticsearch") 在配置文件中找到以elasticsearch开头的
@Data 提供get set 方法
第四步 创建一个实体
@Document(indexName = "product",shards = 3,replicas = 1)
@Document
是Spring Data Elasticsearch提供的一个注解,用于指定Java对象与Elasticsearch索引的映射关系。indexName:索引名
shards:主分片 默认是1
replicas: 副分片 默认是1
@ID 必须全局唯一,在es中位置表示
@Field 属性(type:字段类型 analyzer:分词器 index:索引(默认true) keyword:是否分词)
第五部 创建Dao
是一个接口和service相似 继承ElasticsearchRepository指定类型<实体类型,主键类型>
ElasticsearchRepository
是Spring Data Elasticsearch提供的一个接口,它为我们提供了一组用于操作Elasticsearch的常见CRUD(创建、读取、更新、删除)方法。
接下来java调用ES的Api
ElasticsearchRestTemplate
是Spring Data Elasticsearch提供的一个类,它是基于Elasticsearch的REST API构建的一个高级模板类。它提供了一系列方法来操作Elasticsearch索引,比如索引的创建、文档的索引、更新和删除等。
java如何创建索引
kibanba查看
可以看到索引创建成功了,但是为什么会自动创建了
因为我们在实体上面加了
@Document(indexName = "product",shards = 3,replicas = 1) 所以他会自动创建并分片
并且字段也进行类型也进行匹配
java如何删除索引
kibanba
java如何判定索引是否存在
java如何往es中添加数据
kibanba查询数据
java如果修改es的数据
kibanba
java如何根据id查询数据
kibanba
java如何查询这个索引下的全部数据
kibanba
java如何删除索引数据
kibanba
java如何批量新增数据
kibanba
java如何进行分页并进行排序
java如何进行复杂的查询
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 8,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "product",
"_type" : "_doc",
"_id" : "7",
"_score" : 1.0,
"_source" : {
"_class" : "com.example.estest.Product",
"id" : 7,
"title" : "华为",
"category" : "3",
"price" : 4.0,
"image" : "www.baidu.com"
}
},
{
"_index" : "product",
"_type" : "_doc",
"_id" : "0",
"_score" : 1.0,
"_source" : {
"_class" : "com.example.estest.Product",
"id" : 0,
"title" : "小米0",
"category" : "手机",
"price" : 200.0,
"image" : "www.baidu.com"
}
},
{
"_index" : "product",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"_class" : "com.example.estest.Product",
"id" : 2,
"title" : "小米2",
"category" : "手机",
"price" : 202.0,
"image" : "www.baidu.com"
}
},
{
"_index" : "product",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"_class" : "com.example.estest.Product",
"id" : 3,
"title" : "小米3",
"category" : "手机",
"price" : 203.0,
"image" : "www.baidu.com"
}
},
{
"_index" : "product",
"_type" : "_doc",
"_id" : "4",
"_score" : 1.0,
"_source" : {
"_class" : "com.example.estest.Product",
"id" : 4,
"title" : "小米4",
"category" : "手机",
"price" : 204.0,
"image" : "www.baidu.com"
}
},
{
"_index" : "product",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"_class" : "com.example.estest.Product",
"id" : 1,
"title" : "小米1",
"category" : "手机",
"price" : 201.0,
"image" : "www.baidu.com"
}
},
{
"_index" : "product",
"_type" : "_doc",
"_id" : "6",
"_score" : 1.0,
"_source" : {
"_class" : "com.example.estest.Product",
"id" : 6,
"title" : "vivo",
"category" : "3",
"price" : 4.0,
"image" : "www.baidu.com"
}
},
{
"_index" : "product",
"_type" : "_doc",
"_id" : "9",
"_score" : 1.0,
"_source" : {
"_class" : "com.example.estest.Product",
"id" : 9,
"title" : "苹果",
"category" : "XR",
"price" : 4.0,
"image" : "www.baidu.com"
}
}
]
}
}
这是我的product索引的数据
想实现查询category是小米的数据,并且按照价格倒序,分页查询如何实现
想实现查询category是小米的数据,或category是XR,并且按照价格倒序排序,分页查询 如何实现
想实现查询category是小米的数据或category是XR,想查询价格大于等于4小于等于202的数据,并且按照价格排序,分页查询,如何实现,
想实现查询title是小米的数据,或title是苹果的数据,按照价格倒序排序,实现分页,如何实现
想实现查询title是小米的数据,获取category是3的数据,按照价格倒序排序,实现分页,如何实现
如果我只想返回id,title字段,其他字段为null
高亮显示就不介绍了,还有分组,聚合都是可以的
有一些坑,我说下
坑1
大家可以看到为什么查不到小米呢,是因为title的实体是@Field(type = FieldType.Text)
text代表分词,而termQuery则代表精准查询,所以会出现问题,会出来查询不到结果
坑2
2个结果不一样的
坑3
一旦创建了索引,没有办法进行修改,索引创建索引和字段类型一定要慎重。(目前我所知的解决办法是删除索引,重新创建)
坑4 也可以设定时间,但是需要指定类型。
ES(Elasticsearch)默认使用UTC(协调世界时)作为时区,但是在源数据中存储的时间是基于本地时区的。这可能导致在查询时显示的时间与实际时间不同。