Elasticsearch——spring-boot-starter-data-elasticsearch详解

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

spring-boot-starter-data-elasticsearch

1、概述

Spring Data Elasticsearch是Spring Data项目下的一个子模块。
查看 Spring Data的官网:http://projects.spring.io/spring-data/
Spring Data 的使命是给各种数据访问提供统一的编程接口,不管是关系型数据库(如MySQL),还是非关系数据库(如Redis),或者类似Elasticsearch这样的索引数据库。从而简化开发人员的代码,提高开发效率。

Spring Boot与Elasticsearch的对应版本:

引入依赖:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
    </dependencies>

Elasticsearch的版本为7.16,所以选择2.4以上版本的SpringBoot。

2、配置

2.1、有密码

application.yml

    es:
      address: 127.0.0.1
      port: 9200
      scheme: http
      username: elastic
      password: 123456
    @Configuration
    public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {
    
        @Value("${es.address}")
        String address;
    
        @Value("${es.port}")
        Integer port;
    
        @Value("${es.scheme}")
        String scheme;
    
        @Value("${es.username}")
        String username;
    
        @Value("${es.password}")
        String password;
    
    
    
        @Override
        public RestHighLevelClient elasticsearchClient() {
            final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
            RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(address, port, scheme))
                    .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                        @Override
                        public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                            return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                        }
                    });
            RestHighLevelClient esClient = new RestHighLevelClient(restClientBuilder);
            return esClient;
        }
    }

2.1、无密码
    @Configuration
    public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {
    
        @Value("${es.address}")
        String address;
    
        @Value("${es.port}")
        Integer port;
    
        @Value("${es.scheme}")
        String scheme;
    
        @Value("${es.username}")
        String username;
    
        @Value("${es.password}")
        String password;
        @Override
        public RestHighLevelClient elasticsearchClient() {
            RestClientBuilder builder = null;
            builder = RestClient.builder(new HttpHost(address, port, scheme));
            RestHighLevelClient client =  new RestHighLevelClient(builder);
            return client;
        }
    }

3、实体

    @Document(indexName = "book", createIndex = true)
    public class Book {
    
        @Id
        @Field(type = FieldType.Long)
        private Long id;
    
        @Field(type = FieldType.Keyword, store = true)
        private String name;
    
        @Field(type = FieldType.Text, store = false, analyzer = "ik_smart")
        private String describe;
    
        @Field(type = FieldType.Text, analyzer = "ik_smart")
        private String author;
    
        @Field(type = FieldType.Double)
        private Double price;
    
        @Field(type = FieldType.Date, format = DateFormat.basic_date )
        private Date createTime;
    
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getDescribe() {
            return describe;
        }
    
        public void setDescribe(String describe) {
            this.describe = describe;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    
        public Double getPrice() {
            return price;
        }
    
        public void setPrice(Double price) {
            this.price = price;
        }
    
        public Date getCreateTime() {
            return createTime;
        }
    
        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }
    
        @Override
        public String toString() {
            return "Book{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", describe='" + describe + '\'' +
                    ", author='" + author + '\'' +
                    ", price=" + price +
                    ", createTime=" + createTime +
                    '}';
        }
    }
  • @Document:作用在类,标记实体类为文档对象:

    • indexName:索引名称,它可以包含一个SpEL模板表达式,如log-#{T(java.time.LocalDate).now().toString()}
    • useServerConfiguration:创建索引时是否使用服务器端设置,默认false。
    • shards:主分片数量,默认1.
    • replicas:副本分片数量,默认1.
    • refreshInterval:创建索引时的刷新间隔,默认值为“1s”。
    • indexStoreType:创建索引时的索引存储类型,默认"fs"。
    • createIndex:是否创建索引,默认true。
    • versionType:版本管理,默认VersionType.EXTERNAL
  • @Id:作用在成员变量,标记一个字段作为id主键。

  • @Transient:作用在成员变量,从Document中排除该字段。

  • @GeoPointField:作用在成员变量,标记该字段为GeoPoint类型。

  • @GeoShapeField:作用在成员变量,标记该字段为GeoShape类型。

  • @Field:作用在成员变量,标记为文档的字段,并指定字段映射属性

    • name/value:指定es中的field名称,默认为字段名称。
    • type:字段类型,类型为枚举,默认为FieldType.AUTO。
    • index:是否索引,默认为true。
    • format:Date类型的格式化,枚举类型
    • pattern:自定义格式化
    • store:默认false
    • fielddata:默认false
    • searchAnalyzer:默认""
    • analyzer:默认""
    • normalizer:默认""
    • ignoreFields:默认{}
    • includeInParent:默认false
    • copyTo:默认{}
    • ignoreAbove:默认-1
    • coerce:默认true
    • docValues:默认true
    • ignoreMalformed:默认false
    • indexOptions:默认IndexOptions.none
    • indexPhrases:默认false
    • indexPrefixes:默认{}
    • norms:默认true
    • nullValue:默认""
    • positionIncrementGap:默认-1
    • similarity:默认Similarity.Default
    • termVector:默认TermVector.none
    • scalingFactor:默认1
    • maxShingleSize:默认-1
    • storeNullValue:默认false
    • positiveScoreImpact:默认true
    • enabled:默认true
    • eagerGlobalOrdinals:默认false
    • nullValueType:默认NullValueType.String

4、Respository

    public interface BookRespository extends ElasticsearchRepository<Book, Long> {
    
    }

4.1、接口层次关系

CrudRepository:
提供以Id为参数的CRUD功能:

    @NoRepositoryBean
    public interface CrudRepository<T, ID> extends Repository<T, ID> {
    
    	<S extends T> S save(S entity);
    
    	<S extends T> Iterable<S> saveAll(Iterable<S> entities);
    
    	Optional<T> findById(ID id);
    
    	boolean existsById(ID id);
    
    	Iterable<T> findAll();
    
    	Iterable<T> findAllById(Iterable<ID> ids);
    
    	long count();
    
    	void deleteById(ID id);
    
    	void delete(T entity);
    
    	void deleteAll(Iterable<? extends T> entities);
    
    	void deleteAll();
    }

PagingAndSortingRepository:

在CRUD之上,提供分页和排序功能:

    @NoRepositoryBean
    public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
    
    	Iterable<T> findAll(Sort sort);
    
    	Page<T> findAll(Pageable pageable);
    }

ElasticsearchRepository:
大部分方法在7.x中已经废弃:

    @NoRepositoryBean
    public interface ElasticsearchRepository<T, ID> extends PagingAndSortingRepository<T, ID> {
    
    	@Deprecated
    	default <S extends T> S index(S entity) {
    		return save(entity);
    	}
    
    	@Deprecated
    	<S extends T> S indexWithoutRefresh(S entity);
    
    	@Deprecated
    	Iterable<T> search(QueryBuilder query);
    
    	@Deprecated
    	Page<T> search(QueryBuilder query, Pageable pageable);
    
    	Page<T> search(Query searchQuery);
    
    	Page<T> searchSimilar(T entity, @Nullable String[] fields, Pageable pageable);
    
    	@Deprecated
    	void refresh();
    }

4.2、增删改查
4.2.1、新增
    @Test
    public void add() {
        Book book = new Book();
        book.setId(1l);
        book.setAuthor("罗贯中");
        book.setName("三国演义");
        book.setPrice(42.56);
        book.setCreateTime(new Date());
        book.setDescribe("天下大势,分久必合,合久必分。");
        bookRespository.save(book);
    }
4.2.2、修改
    @Test
    public void update() {
        Book book = new Book();
        book.setId(1l);
        book.setAuthor("罗贯中");
        book.setName("三国演义");
        book.setPrice(55.55);
        book.setCreateTime(new Date());
        book.setDescribe("天下大势,分久必合,合久必分。");
        bookRespository.save(book);
    }
4.2.3、批量新增
    @Test
    public void add_all() {
        List<Book> list = new ArrayList<>();
        Book book1 = new Book();
        book1.setId(2l);
        book1.setAuthor("吴承恩");
        book1.setName("西游记");
        book1.setPrice(33.33);
        book1.setCreateTime(new Date());
        book1.setDescribe("大师兄!师傅又丢了!");
        list.add(book1);
    
        Book book2 = new Book();
        book2.setId(3l);
        book2.setAuthor("曹雪芹");
        book2.setName("红楼梦");
        book2.setPrice(66.66);
        book2.setCreateTime(new Date());
        book2.setDescribe("一朝春尽红颜老,花落人亡两不知。");
        list.add(book2);
    
        Book book3 = new Book();
        book3.setId(4l);
        book3.setAuthor("施耐庵");
        book3.setName("水浒传");
        book3.setPrice(35.22);
        book3.setCreateTime(new Date
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值