整合 Elasticsearch
在 Netty-Boot
项目中,推荐使用 java-db
连接 Elasticsearch,这能够简化与 Elasticsearch 的交互。Elasticsearch
是一个分布式搜索和分析引擎,广泛用于全文搜索、日志分析等场景。通过整合 java-db
和 elasticsearch-rest-high-level-client
,可以快速实现与 Elasticsearch 的连接和操作。
Elasticsearch 连接原理
在 Java 应用中,通过 REST API 与 Elasticsearch 进行交互。elasticsearch-rest-high-level-client
是一个官方提供的高级客户端,基于 REST API 封装了对 Elasticsearch 的操作,使开发者能够通过 Java 代码轻松实现对 Elasticsearch 的索引、查询、删除等功能。
具体的连接和操作流程如下:
- 解析 Elasticsearch DSN:从配置文件中读取 DSN(Data Source Name),获取连接信息(如地址、端口、用户名、密码等)。
- 构建
RestHighLevelClient
:通过RestClientBuilder
构建高层次的客户端RestHighLevelClient
,负责与 Elasticsearch 服务器的通信。 - 身份验证:如果 DSN 包含用户名和密码,则设置身份验证信息,确保客户端能够通过安全验证连接到 Elasticsearch。
- 测试连接:通过客户端的
ping
方法测试连接是否成功,以确保 Elasticsearch 服务可用。 - 资源管理:在应用关闭时,确保客户端连接正确关闭,释放系统资源。
连接 Elasticsearch 示例
1. 添加依赖
在项目的 pom.xml
中添加以下依赖:
<dependency>
<groupId>com.litongjava</groupId>
<artifactId>java-db</artifactId>
<version>${java-db.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.10.0</version>
</dependency>
java-db
:简化数据库和中间件的连接和操作。elasticsearch-rest-high-level-client
:官方提供的高级客户端,用于与 Elasticsearch 进行交互。
2. 添加 Elasticsearch 配置
在环境变量或 .env
配置文件中添加 Elasticsearch 的 DSN:
ELASTICSEARCH_DSN=http://elastic:v6YwugeWM8P2m@118.89.101.45:9200
ELASTICSEARCH_DSN
:Elasticsearch 的连接字符串,包含了用户名、密码、地址和端口等信息。
3. 配置 Elasticsearch 客户端
创建 ImElasticSearchConfig
配置类,通过 RestHighLevelClient
建立与 Elasticsearch 的连接:
import java.io.IOException;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import com.litongjava.annotation.AConfiguration;
import com.litongjava.annotation.AInitialization;
import com.litongjava.es.client.Elastic;
import com.litongjava.es.client.EsDSN;
import com.litongjava.es.client.EsDSNUtils;
import com.litongjava.hook.HookContainer;
import com.litongjava.tio.utils.environment.EnvUtils;
import com.litongjava.tio.utils.hutool.StrUtil;
import lombok.extern.slf4j.Slf4j;
@AConfiguration
@Slf4j
public class ImElasticSearchConfig {
@Initialization
public void config() {
// 从环境变量或配置文件中读取 Elasticsearch DSN
String dsn = EnvUtils.getStr("ELASTICSEARCH_DSN");
if (dsn == null || dsn.isEmpty()) {
System.out.println("DSN is not set");
return;
}
// 解析 DSN
EsDSN esInfo = EsDSNUtils.parse(dsn);
// 创建 HttpHost 实例
HttpHost httpHost = new HttpHost(esInfo.getHost(), esInfo.getPort(), esInfo.getSchema());
// 配置 RestClientBuilder
RestClientBuilder builder = RestClient.builder(httpHost);
String username = esInfo.getUsername();
String password = esInfo.getPassword();
if (StrUtil.isNotEmpty(username)) {
// 设置凭证提供者
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
builder.setHttpClientConfigCallback(httpClientBuilder ->
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
}
// 创建 RestHighLevelClient
RestHighLevelClient client = new RestHighLevelClient(builder);
// 添加到 Elastic 中
Elastic.setClient(client);
// 测试连接状态
try {
log.info("ping es server:{}", client.ping(RequestOptions.DEFAULT));
} catch (IOException e) {
e.printStackTrace();
}
// 关闭时释放资源
HookContainer.me().addDestroyMethod(() -> {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
4. 测试 Elasticsearch 连接
在该配置类中,我们通过解析 ELASTICSEARCH_DSN
来获取 Elasticsearch 的连接信息。然后通过 RestHighLevelClient
与 Elasticsearch 建立连接,并使用 ping
方法测试连接状态。
- 如果连接成功,会在日志中输出
ping es server:true
。 - 如果连接失败,会捕获异常并打印错误信息。
5. 使用 Elasticsearch 客户端
完成配置后,你可以通过 com.litongjava.es.client.Elastic
类来操作 Elasticsearch。这个类封装了客户端的常见操作,使得与 Elasticsearch 的交互更加简单。
例如,你可以通过 Elastic.getClient()
来获取 RestHighLevelClient
,然后执行索引、查询、删除等操作。
RestHighLevelClient client = Elastic.getClient();
// 使用 client 执行 Elasticsearch 操作
6. 资源管理
在项目结束或服务关闭时,确保客户端连接被正确关闭以释放系统资源。我们通过 HookContainer
在服务器关闭时自动调用 RestHighLevelClient.close()
方法,防止资源泄漏。
总结
通过上述步骤,我们在 Netty-Boot
项目中成功集成了 Elasticsearch,并使用 elasticsearch-rest-high-level-client
实现了与 Elasticsearch 的连接和操作。通过 java-db
的简化操作,开发者能够快速上手 Elasticsearch,进行各种复杂的搜索和分析功能。
Elasticsearch 连接的工作原理
- 解析 DSN:从环境变量或配置文件中获取 Elasticsearch 的连接信息,并解析出主机、端口、用户名、密码等。
- 创建客户端:通过
RestClientBuilder
创建RestHighLevelClient
,并配置必要的身份验证信息。 - 测试连接:通过
ping
方法测试客户端是否成功连接到 Elasticsearch 服务器,确保服务可用。 - 操作 Elasticsearch:通过封装的
Elastic
类,开发者可以方便地操作 Elasticsearch,执行各种索引、查询、更新和删除等操作。 - 资源管理:在应用关闭时,通过钩子函数自动关闭 Elasticsearch 客户端,释放资源。
通过这一整合方案,开发者可以快速构建基于 Elasticsearch 的强大搜索和分析系统,实现高效的全文检索和数据分析功能。