springdata框架对es集成

什么是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(协调世界时)作为时区,但是在源数据中存储的时间是基于本地时区的。这可能导致在查询时显示的时间与实际时间不同。

​​​​​​​

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值