Springboot 系列 (21) - Springboot+ElasticSearch 实现全文搜索(三)| Springboot 项目调用 ElasticSearch API
在 “Springboot 系列 (19) - Springboot+ElasticSearch 实现全文搜索(一)” 和 “Springboot 系列 (20) - Springboot+ElasticSearch 实现全文搜索(二)” 里我们演示了安装配置 ElasticSearch (包括 Kibana 和 Logstash) 和使用 curl 调用 ElasticSearch API,本文将演示在 Springboot 项目里如何调用 ElasticSearch API。
1. ElasticSearch 运行环境
操作系统:Ubuntu 20.04
内网 IP:192.168.1.3
ElasticSearch 版本:7.10.2
ElasticSearch 所在路径:~/apps/elasticsearch-7.10.2/
ElasticSearch 端口: 9200
ElasticSearch 账户(用户名/密码):elastic / 123456
2. Springboot 开发环境
Windows版本:Windows 10 Home (20H2)
IntelliJ IDEA (https://www.jetbrains.com/idea/download/):Community Edition for Windows 2020.1.4
Apache Maven (https://maven.apache.org/):3.8.1
注:Spring 开发环境的搭建,可以参考 “ Spring基础知识(1)- Spring简介、Spring体系结构和开发环境配置 ”。
3. 创建 Springboot 基础项目
项目实例名称:SpringbootExample19
Spring Boot 版本:2.6.6
创建步骤:
(1) 创建 Maven 项目实例 SpringbootExample19;
(2) Spring Boot Web 配置;
(3) 导入 Thymeleaf 依赖包;
(4) 配置 jQuery;
具体操作请参考 “Springboot 系列 (2) - 在 Spring Boot 项目里使用 Thymeleaf、JQuery+Bootstrap 和国际化” 里的项目实例 SpringbootExample02,文末包含如何使用 spring-boot-maven-plugin 插件运行打包的内容。
SpringbootExample19 和 SpringbootExample02 相比,SpringbootExample19 不配置 Bootstrap、模版文件(templates/*.html)和国际化。
4. 添加 Elasticsearch 依赖
1) 修改 pom.xml,导入 Elasticsearch 依赖包
<project ... >
...
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
...
</dependencies>
...
</project>
在IDE中项目列表 -> SpringbootExample19 -> 点击鼠标右键 -> Maven -> Reload Project
2) 修改 src/main/resources/application.properties 文件,添加如下配置
# ElasticSearch spring.elasticsearch.rest.uris=192.168.1.3:9200 spring.elasticsearch.rest.username=elastic spring.elasticsearch.rest.password=123456
5. 测试实例 (Web 模式)
1) 创建 src/main/java/com/example/config/ElasticSearchRestClientConfig.java 文件
1 package com.example.config;
2
3 import org.springframework.beans.factory.annotation.Value;
4 import org.springframework.context.annotation.Bean;
5 import org.springframework.context.annotation.Configuration;
6 import org.springframework.data.elasticsearch.client.ClientConfiguration;
7 import org.springframework.data.elasticsearch.client.RestClients;
8 import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
9
10 import org.elasticsearch.client.RestHighLevelClient;
11
12 @Configuration
13 public class ElasticSearchRestClientConfig extends AbstractElasticsearchConfiguration {
14 @Value("${spring.elasticsearch.rest.uris}")
15 private String uris;
16 @Value("${spring.elasticsearch.rest.username}")
17 private String username;
18 @Value("${spring.elasticsearch.rest.password}")
19 private String password;
20
21 @Override
22 @Bean
23 public RestHighLevelClient elasticsearchClient() {
24
25 final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
26 .connectedTo(uris)
27 .withBasicAuth(username, password)
28 .build();
29
30 return RestClients.create(clientConfiguration).rest();
31 }
32
33 }
2) 创建 src/main/resources/templates/client.html 文件
1 <html lang="en" xmlns:th="http://www.thymeleaf.org">
2 <head>
3 <meta charset="UTF-8">
4 <title th:text="${var}">Title</title>
5 <script language="javascript" th:src="@{/lib/jquery/jquery-3.6.0.min.js}"></script>
6 </head>
7 <body>
8
9 <h3>ElasticSearch Client</h3>
10 <hr>
11 <p>
12 Operation:<br>
13 <select id="operation" name="operation" style="width: 50%;height: 32px;">
14 <option value=""></option>
15 <option value="create_springboot">1. 创建一个索引 "springboot"</option>
16 <option value="get_springboot">2. 查看 "springboot"</option>
17 <option value="delete_springboot">3. 删除 "springboot"</option>
18 <option value="create_springboot_settings">4. 创建一个带 settings 的索引 "springboot"</option>
19 <option value="get_springboot_settings">5. 查看带 settings 的 "springboot"</option>
20 <option value="create_doc1_auto">6. 在 "springboot/doc1" 下创建一个文档(自动生成 _id)</option>
21 <option value="create_doc1_2">7. 在 "springboot/doc1/2" 下创建一个文档(指定 _id 为 2)</option>
22 <option value="create_doc1_batch">8. 在 "springboot/doc1" 下批量创建文档(自动生成 _id)</option>
23 <option value="get_doc1_2">9. 查看 "springboot/doc1/2"</option>
24 <option value="modify_doc1_2">10. 修改 "springboot/doc1/2"</option>
25 <option value="delete_doc1_2">11. 删除 "springboot/doc1/2"</option>
26 <option value="query_springboot_docs">12. 查询 "springboot" 下的全部文档 </option>
27 <option value="term_query_springboot_docs">13. 精准查询 "springboot" 下 name="Elastic Search" (_id=2) 的文档 </option>
28 <option value="match_query_springboot_docs">14. 模糊查询 "springboot" 下 name 包含 "Elastic Search" 的文档 </option>
29 </select>
30 </p>
31 <p id="raw_area" style="display:none;">
32 Raw (JSON):<br>
33 <textarea name="raw" id="raw" rows="3" style="width: 50%;"></textarea>
34