如果你想阅读更详细的内容请点击这里-SpringDataElasticsearch使用参考文档-机器翻译 前提:你得有一个运行起来的Elasticsearch节点
在这之前,你可能用过各种springboot的data-start。既然你看到了这篇文章,那么今天就让我们一起来学习一下。
1、万恶的开始
1.1、必须的pom引入,如果你不知道去哪里找,请点击这里去选择你需要的版本。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
1.2、
使用springboot的配置文件配置Elasticsearch:properties属性配置(其他属性自行配置),如果不配置链接属性,则默认使用localhost:9200
链接
spring:
data:
elasticsearch:
client:
reactive:
endpoints: 127.0.0.1:9200
connection-timeout: 链接到es的超时时间,毫秒为单位,默认10秒(10000毫秒)
socket-timeout: 读取和写入的超时时间,单位为毫秒,默认5秒(5000毫秒)
elasticsearch:
rest:
uris: 127.0.0.1:9200
# 这两个属性在新版本的springboot中已经不建议使用,9300属于elasticsearch各节点之间的通讯接口。
# 属于lowlevelclient。我们推荐使用9200的RestHighLevelClient去链接
# cluster-nodes: 127.0.0.1:9300
# cluster-name: helloElasticsearch
1.3、使用JAVA方式配置
/**
* @author scarecrow
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "elastic")
public class ElasticsearchConfig {
private String host;
private Long connectTimeout;
private Long socketTimeout;
//private int port;
@Bean
public RestHighLevelClient client(){
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(host)
.withConnectTimeout(connectTimeout)
.withSocketTimeout(socketTimeout)
.build();
return RestClients.create(clientConfiguration).rest();
}
/*9@Bean
public RestHighLevelClient client(){
HttpHost httpHost = new HttpHost("127.0.0.1",9200);
RestClientBuilder builder = RestClient.builder(httpHost);
builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder builder) {
return builder.setSocketTimeout(socketTimeout.intValue()).setConnectTimeout(connectTimeout.intValue());
}
});
RestHighLevelClient highLevelClient = new RestHighLevelClient(builder);
return highLevelClient;
}*/
}
2.简单查询
2.1实体类注解
- Document
- indexName:索引的名字
- type:文档类型名称
- shards:分片数,默认5
- replicas:副本数量,默认1
- createIndex:是否创建索引(索引不存在的情况下),默认true
- useServerConfiguration:创建索引的时候,是否使用服务端的配置,默认为false
- refreshInterval:刷新频率
即配置一个文档新增后多久可以查询到
,默认为1秒 - indexStoreType:索引存储方式,默认为
fs
文件存储类型
- Field
- format:时间格式,默认无,存储毫秒数。具体参数可参照
org.springframework.data.elasticsearch.annotations.DateFormat
- index:是否进行分词,默认为
true
- searchAnalyzer:指定字段搜索时使用的分词器
- analyzer:指定字段建立索引时所使用的分词器
- ignoreFields:指定忽略字段
- type:指定字段类型,具体可参照
org.springframework.data.elasticsearch.annotationsFieldType
- 例子
@Document(indexName = "user", type = "user")
public class Person {
@Id//必须有id注解
private String id;
private String name;
private int age;
private String idCard;
}
2.2:Repository
类似于jpa,我们写Repository的时候只需继承ElasticsearchRepository<T,IdType>即可。该接口继承了ElasticsearchCrudRepository,可以实现一些基本的增删查改操作。操作和jpa类似。同样支持属性表达式
。
- 增/改:add,addAll
- 删:deleteXXXX
- 查:findXXXX
- 例子
@Repository
public interface PersonRep extends ElasticsearchRepository<Person, String> {
}
........
{
@AutoWried
private PersonRep personRep;
...
personRep.findAll();
personRep.findAll(pageable);
personRep.save();
personRep.findByName(name);
...
}
2.3:可能有点儿高级的搜索
- 2.3.1 限制查询结果的数量
使用top或者first
关键字可以互换使用。将可选的数值附加到top或者or后面指定要返回的结果数量大小。如果缺省则默认返回一条。
//下面两条查询的效果是一样的
personRep.findFirst3ByName(name);
personRep.findTop3ByName(name);
//只查一条
personRep.findTopByName(name)
异常整理
/**
* Springboot整合Elasticsearch 在项目启动前设置一下的属性,防止报错
* 解决netty冲突后初始化client时还会抛出异常
* java.lang.IllegalStateException: availableProcessors is already set to [4], rejecting [4]
*/
System.setProperty("es.set.netty.runtime.available.processors", "false");
//TODO 文章未完,待续