- 发布日期:2025-05-10 20:57 点击次数:122 序论
在当代的搜索和分析左右中,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进阶助手
迷水商城抢先一步学习进阶干货! 本站仅提供存储职业,通盘内容均由用户发布,如发现存害或侵权内容,请点击举报。- 日本10月中枢计械订单四个月连降,激勉企业开销相干疑虑2025-05-10
- 北京通好意思科创板IPO中止,“提交注册”已接近三年2025-05-10
- 旅游若何更精确策划?多个景区及文旅平台接入DeepSeek2025-05-10
- Elasticsearch 8.X 最新 Java Api Client 好意思满代码,可径直用于方式实战2025-05-10
- 升级打造购房“1+3”一站式专项金融行状,江苏银行蹂躏提振举止再出实招2025-05-10
- 文采期货6红绿柱支抓压力变色主图缠绵,顶底多空幅图缠绵源码2025-05-10