作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
打脸系列【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
:默认falsefielddata
:默认falsesearchAnalyzer
:默认""analyzer
:默认""normalizer
:默认""ignoreFields
:默认{}includeInParent
:默认falsecopyTo
:默认{}ignoreAbove
:默认-1coerce
:默认truedocValues
:默认trueignoreMalformed
:默认falseindexOptions
:默认IndexOptions.noneindexPhrases
:默认falseindexPrefixes
:默认{}norms
:默认truenullValue
:默认""positionIncrementGap
:默认-1similarity
:默认Similarity.DefaulttermVector
:默认TermVector.nonescalingFactor
:默认1maxShingleSize
:默认-1storeNullValue
:默认falsepositiveScoreImpact
:默认trueenabled
:默认trueeagerGlobalOrdinals
:默认falsenullValueType
:默认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