本文springboot版本为2.2.6,使用spring-boot-2.1.4会失败
1. pom.xml引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
<scope>compile</scope>
</dependency>
2. application.yml配置es信息
spring:
jpa:
show-sql: true
elasticsearch:
rest:
uris: http://localhost:9200
username: user
password: pwd
3. UserService
package com.es.test.service;
import com.alibaba.fastjson.JSONObject;
import com.es.test.repository.UserRepository;
import com.es.test.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@Service
public class UserService {
@Autowired
private UserRepository UserRepository;
public void save(JSONObject friends) {
User user = User.builder()
.name("xiaoq")
.age(18)
.time(LocalDateTime.now().toString())
.friends(friends)
.build();
UserRepository.save(user);
}
}
4. UserRepository
package com.es.test.repository;
import com.es.test.model.User;
public interface UserRepository {
User save(User user);
}
5. JpaUserRepository
package com.es.test.repository;
import com.es.test.repository.UserRepository;
import com.es.test.model.User;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface JpaUserRepository extends UserRepository, ElasticsearchRepository<User, String> {
@Override
User save(User user);
}
6. User
package com.es.test.model;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "user", createIndex = false)
public class User {
@Id
private String id;
@Field(type = FieldType.Keyword)
private String name;
@Field(type = FieldType.Long)
private String age;
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS||yyyy-MM-dd HH:mm:ss")
private String time;
@Field(type = FieldType.Object)
private JSONObject friends;
}
注意:没有id会发生异常:Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaUserRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: No id property found for class com.es.test.model.User!
其他:docker 启动es(默认用户:elastic)
docker run \
--name elasticSearch \
-e discovery.type=single-node \
-e xpack.security.enabled=true \
-e ELASTIC_PASSWORD=pwd \
-p 9200:9200 \
-p 9300:9300 \
-d docker.elastic.co/elasticsearch/elasticsearch:7.7.1