2025-12-22 19:03 点击次数:131

在当代的搜索和分析哄骗中,Elasticsearch 照旧成为不行或缺的组件。
跟着 Elasticsearch 8.X 的发布,其 Java 客户端 API 也有了显耀的更新。
图片
本文将基于完竣的 Java 代码,翔实先容如安在工程中使用 Elasticsearch 8.X 的最新 Java API Client。
干货 | Elasticsearch Java 客户端演进历史和选型指南
通过替换示例代码中的部天职容,不错将其顺利哄骗于骨子的技俩开拓中。
一、8.X 最新 Java API Client特点概览1. 强类型请乞降反应类型安全
针对系数的 Elasticsearch API,客户端王人提供了强类型的请乞降响顶住象,减少了运行时造作的可能性。
自动完成相沿
强类型的联想使得 IDE 不错更好地提供代码领导和自动完成,擢升开拓遵循。
2. 同步和异步 API同步操作
适用于需要按依法程实际的操作,确保每个申请王人在前一个申请完成后实际。
异步操作
提供非荆棘的花式实际 API 调用,适用于需要高并发或对反应技艺敏锐的哄骗。
3. 流式构建器和函数式编程模式流式接口
使用链式调用花式,不错简易地构建复杂的申请。
函数式编程
通过 Lambda 抒发式,简化代码编写,擢升可读性。
4. 无缝集成对象映射器Jackson 相沿
默许使用 Jackson 当作 JSON 领路库,通俗将自界说的 Java 对象与 JSON 数据相互调度。
JSON-B 相沿
也不错选拔使用任何杀青了 JSON-B 圭臬的库,无礼不同项贪图需求。
5. 基于底层 REST 客户端的条约处理条约详尽:
将条约处理交付给底层的 HTTP 客户端,如 Java Low Level REST Client。
流畅搞定:
处理 HTTP 流畅池、重试机制、节点发现等底层细节,开拓者无需眷注。
这意味着:流畅池搞定:自动搞定 HTTP 流畅池,擢升性能。重试机制:在申请失败时,客户端不错自动重试节点发现:相沿自动发现集群中的节点,杀青负载平衡。开拓者无需手动处理这些复杂的细节,只需眷注业务逻辑。https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/introduction.html二、环境准备在滥觞之前,确保我们照旧在土产货或事业器上获胜装配并运行了 Elasticsearch 8.X。同期,我们的开拓环境需要具备以下条目:
Java 版块:JDK 1.8 或更高版块 依赖库:Elasticsearch Java API Client 在 pom.xml 文献中添加以下依赖:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mingyi.cn</groupId> <artifactId>ESJavaClient</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> <version>8.11.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> </dependencies> </project>三、Elasticsearch 客户端启动化1. 基于 HTTPS 的客户端启动化
Elasticsearch 8.X 默许开启了安全特点,需要通过 HTTPS 进行通讯。以下是启动化客户端的主要形势:
建树认证信息:使用用户名和密码进行身份考据。
加载 CA 文凭:用于诞生安全的 SSL 流畅。
图片
配置 SSL 荆棘文:创建 SSLContext,用于 HTTP 客户端构建。
// 建树用户名和密码final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "your_password"));// 加载 CA 文凭Path caCertificatePath = Paths.get("path/to/http_ca.crt");CertificateFactory factory = CertificateFactory.getInstance("X.509");Certificate trustedCa;try (InputStream is = Files.newInputStream(caCertificatePath)) { trustedCa = factory.generateCertificate(is);}// 配置 SSL 荆棘文KeyStore trustStore = KeyStore.getInstance("pkcs12");trustStore.load(null, null);trustStore.setCertificateEntry("ca", trustedCa);SSLContextBuilder sslContextBuilder = SSLContexts.custom() .loadTrustMaterial(trustStore, null);final SSLContext sslContext = sslContextBuilder.build();// 构建 RestClientRestClientBuilder builder = RestClient.builder( new HttpHost("localhost", 9200, "https")) .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder .setSSLContext(sslContext) .setDefaultCredentialsProvider(credentialsProvider) .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE));RestClient restClient = builder.build();// 创建 Elasticsearch 客户端ElasticsearchTransport transport = new RestClientTransport( restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);2. 使用 API Key 的客户端启动化(可选)若是但愿使用 API Key 进行认证,不错按照以下花式配置:
String apiKeyId = "your_api_key_id";String apiKeySecret = "your_api_key_secret";String apiKeyAuth = Base64.getEncoder().encodeToString( (apiKeyId + ":" + apiKeySecret).getBytes(StandardCharsets.UTF_8));Header[] defaultHeaders = { new BasicHeader("Authorization", "ApiKey " + apiKeyAuth)};builder.setDefaultHeaders(defaultHeaders);四、基本操作示例1. 创建索引public void createIndex(String indexName) throws IOException { client.indices().create(c -> c.index(indexName));}2. 索引文档public void indexDocument(String indexName, String id, Map<String, Object> document) throws IOException { client.index(i -> i.index(indexName).id(id).document(document));}3. 搜索文档public SearchResponse<Object> search(String indexName, List<Query> queries, List<SortOptions> sortOptions, int page, int pageSize) throws IOException { SearchRequest.Builder searchRequestBuilder = new SearchRequest.Builder() .index(indexName) .from(page * pageSize) .size(pageSize) .query(q -> q.bool(b -> b.must(queries))); if (sortOptions != null && !sortOptions.isEmpty()) { searchRequestBuilder.sort(sortOptions); } return client.search(searchRequestBuilder.build(), Object.class);}4. 团员查询public SearchResponse<Object> aggregateSearch(String indexName, List<Query> queries, Map<String, Aggregation> aggregations) throws IOException { return client.search(s -> s .index(indexName) .query(q -> q.bool(b -> b.must(queries))) .aggregations(aggregations), Object.class);}5. 剧本排序示例public SearchResponse<Map> searchWithScriptSort(String indexName, String fieldName, String queryText, String scriptSource, double factor) throws IOException { Query query = MatchQuery.of(m -> m.field(fieldName).query(queryText))._toQuery(); Script script = Script.of(s -> s.inline(i -> i .source(scriptSource) .params("factor", JsonData.of(factor)))); SortOptions sortOptions = SortOptions.of(so -> so.script(ss -> ss .script(script) .type(ScriptSortType.Number) .order(SortOrder.Asc))); SearchRequest searchRequest = new SearchRequest.Builder() .index(indexName) .query(query) .sort(sortOptions) .build(); return client.search(searchRequest, Map.class);}五、完竣代码示例以下是完竣的代码示例,人人不错凭证需要进行替换和修改,以相宜我们我方的工程需求。
public class ElasticsearchService { private static final Logger logger = LoggerFactory.getLogger(ElasticsearchService.class); private ElasticsearchClient client; // 构造函数,启动化客户端 public ElasticsearchService() throws CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException { // 启动化代码(参考前文) } // 创建索引 public void createIndex(String indexName) throws IOException { client.indices().create(c -> c.index(indexName)); } // 索引文档 public void indexDocument(String indexName, String id, Map<String, Object> document) throws IOException { client.index(i -> i.index(indexName).id(id).document(document)); } // 搜索文档 public SearchResponse<Object> search(...) throws IOException { // 杀青代码(参考前文) } // 团员查询 public SearchResponse<Object> aggregateSearch(...) throws IOException { // 杀青代码(参考前文) } // 剧本排序示例 public SearchResponse<Map> searchWithScriptSort(...) throws IOException { // 杀青代码(参考前文) } // 主措施示例 public static void main(String[] args) { try { ElasticsearchService service = new ElasticsearchService(); String indexName = "my-index"; // 创建索引 service.createIndex(indexName); // 索引文档 Map<String, Object> document = new HashMap<>(); document.put("title", "Elasticsearch Basics"); document.put("author", "John Doe"); document.put("content", "This is a tutorial for Elasticsearch."); service.indexDocument(indexName, "1", document); logger.info("Document indexed."); // 刷新索引 service.client.indices().refresh(r -> r.index(indexName)); // 搜索示例 Query query = QueryBuilders.match(m -> m.field("title").query("Elasticsearch")); List<Query> queries = Arrays.asList(query); SearchResponse<Object> response = service.search(indexName, queries, null, 0, 10); response.hits().hits().forEach(hit -> logger.info(hit.source().toString())); // 团员查询示例 Aggregation aggregation = AggregationBuilders.terms(t -> t.field("author.keyword")); Map<String, Aggregation> aggMap = new HashMap<>(); aggMap.put("author_count", aggregation); SearchResponse<Object> aggResponse = service.aggregateSearch(indexName, queries, aggMap); aggResponse.aggregations().forEach((key, agg) -> logger.info(key + ": " + agg)); // 剧本排序示例 String scriptSource = "doc['content.keyword'].value.length() * params.factor"; double factor = 1.1; SearchResponse<Map> scriptSortResponse = service.searchWithScriptSort(indexName, "content", "Elasticsearch", scriptSource, factor); scriptSortResponse.hits().hits().forEach(hit -> logger.info(hit.source().toString())); } catch (Exception e) { logger.error("Error occurred:", e); } }}六、醒目事项6.1 认证花式Elasticsearch 8.X 默许开启了安全认证,我们需要凭证骨子情况选拔使用用户名密码认证或 API Key 认证。
6.2 SSL 文凭确保正确加载了 Elasticsearch 提供的 CA 文凭,以诞生安全的 SSL 流畅。
6.3 依赖版块请确保使用的 Elasticsearch Java API Client 版块与 Elasticsearch 事业器版块匹配。
七、回想本文翔实先容了如何使用 Elasticsearch 8.X 的最新 Java API 进行客户端启动化、索引操作、搜索和团员查询。
通过完竣的代码示例,我们不错顺利将其哄骗于工程开拓中。但愿本文能对人人在使用 Elasticsearch 进行开拓时提供匡助。
图片
实际效果截图
图片
新写入索引数据
图片
完竣可用工程下载地址:https://t.zsxq.com/yLZmm
七、参考费力Elasticsearch Java API Client 官方文档https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/index.html干货 | Elasticsearch Java 客户端演进历史和选型指南Elasticsearch 安全通讯配置云事业器 Centos7 部署 Elasticsearch 8.0 + Kibana 8.0 指南Elasticsearch 团员查询基于儿童积木玩物图解 Elasticsearch 团员更短技艺更快习得更多干货!
和全球超2000+ Elastic 疼爱者通盘精进!
elastic6.cn——ElasticStack进阶助手久久久久久一级毛片免费野外
抢先一步学习进阶干货! 本站仅提供存储事业,系数内容均由用户发布,如发现存害或侵权内容,请点击举报。