Springboot整合ElasticSearch

1、创建项目时勾选:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2、创建RestHighLevelClient对象并注入容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {

@Bean
@Override
public RestHighLevelClient elasticsearchClient() {
// 定义客户端配置对象
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("localhost:9200")
.build();
// 使用 RestClients创建对象
return RestClients.create(clientConfiguration).rest();
}
}

3、使用RestHighLevelClient进行crud

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
@SpringBootTest
class Elasticsearch01ApplicationTests {

@Autowired
private RestHighLevelClient restHighLevelClient;

@Test
public void testInsert() throws IOException {
User user = new User();
user.setName("李四四");
user.setAge(29);
IndexRequest indexRequest = new IndexRequest("test", "user", "6");
indexRequest.source(JSON.toJSONString(user), XContentType.JSON);
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(indexResponse.status());
}

@Test
public void testUpdate() throws IOException {
User user = new User();
user.setName("张三");
user.setAge(18);
UpdateRequest updateRequest = new UpdateRequest("test","user", "4");
updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse.status());
}

@Test
public void testDelete() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("test", "1");
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());
}

@Test
public void testSearch() throws IOException {
SearchRequest searchRequest = new SearchRequest("test");
// 搜索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("name", "张"))
.sort("age", SortOrder.DESC)
.postFilter(QueryBuilders.rangeQuery("age").gt(22))
.highlighter(new HighlightBuilder().field("name")); .from(0)
.size(2);
searchRequest.source(searchSourceBuilder);
// 发起搜索请求
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
TotalHits totalHits = searchResponse.getHits().getTotalHits();
System.out.println("文档总数:" + totalHits);
float maxScore = searchResponse.getHits().getMaxScore();
System.out.println("最高命中得分:" + maxScore);
SearchHit[] searchHits = searchResponse.getHits().getHits();
for (SearchHit searchHit : searchHits) {
System.out.println(searchHit.getSourceAsMap());
}

}
}

4、使用ElasticSearchRepository进行简单的crud
4.1 在实体类中添加注解:

1
2
3
4
5
6
7
8
9
10
11
@Data
// 映射文档
@Document(indexName = "test")
public class User {
@Id
private String id;
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String name;
@Field(type = FieldType.Integer)
private Integer age;
}

4.2 添加自定义接口并继承ElasticsearchRepository<T,T>

1
2
public interface UserRepository extends ElasticsearchRepository<User,String> {
}

4.3 使用自定义的接口操作数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@SpringBootTest
public class TestUserRepository {

@Autowired
private UserRepository userRepository;

@Test
public void testSave(){
User user = new User();
// id不存在保存,存在则更新
user.setId(UUID.randomUUID().toString().replace("-",""));
user.setName("张伟");
user.setAge(10);
userRepository.save(user);
}

@Test
public void testDelete(){
// deleteAll 删除所有
userRepository.deleteById("d6d99c19-6a8d-4ab5-bd71-f2586e07b28b");
}

@Test
public void testFindOne(){
Optional<User> userOptional = userRepository.findById("2");
System.out.println(userOptional.get());
}

@Test
public void testFindAll(){
// 排序
Iterable<User> all = userRepository.findAll(Sort.by(Sort.Order.desc("age")));
// 分页
Page<User> all1 = userRepository.findAll(PageRequest.of(1, 2));
all1.forEach(user -> System.out.println(user));
}
}