Elasticsearch 在 Java 中的使用教程

打印 上一主题 下一主题

主题 1864|帖子 1864|积分 5602

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目录


  • Elasticsearch 简介
  • 环境准备
  • 使用 Java 连接 Elasticsearch
  • 基本 CRUD 操作
  • 复杂查询操作
  • 索引管理与优化
  • 聚合操作
  • 总结

1. Elasticsearch 简介

Elasticsearch 是一个分布式搜索和分析引擎,基于 Apache Lucene 构建,可以或许实现实时数据的存储、搜索、和分析。它广泛应用于全文搜索、日记分析、性能监控等领域。Elasticsearch 的核心概念包罗文档(document)、索引(index)、和分片(shard)。
2. 环境准备

2.1 安装 Elasticsearch

从 Elasticsearch 官方网站 下载并安装适合你操作系统的版本。
安装完成后,通过以下命令启动 Elasticsearch 服务:
  1. ./bin/elasticsearch
复制代码
默认环境下,Elasticsearch 运行在 http://localhost:9200。
2.2 Java 开辟环境配置


  • 安装 Java SDK(JDK 11 或更高版本)。
  • 安装 Maven 或 Gradle。
  • 创建一个 Maven 项目,添加 Elasticsearch Java 客户端的依赖。
2.3 添加 Elasticsearch 客户端依赖

在 Maven 项目的 pom.xml 文件中添加以下依赖:
  1. <dependencies>
  2.     <!-- Elasticsearch Java Client -->
  3.     <dependency>
  4.         <groupId>co.elastic.clients</groupId>
  5.         <artifactId>elasticsearch-java</artifactId>
  6.         <version>8.10.0</version>
  7.     </dependency>
  8. </dependencies>
复制代码
假如你使用 Gradle,可以在 build.gradle 文件中添加以下依赖:
  1. dependencies {
  2.     implementation 'co.elastic.clients:elasticsearch-java:8.10.0'
  3. }
复制代码
添加依赖后,确保项目可以或许正常编译。
3. 使用 Java 连接 Elasticsearch

接下来,我们将编写一个简单的 Java 步伐来连接 Elasticsearch。
3.1 编写连接代码

创建一个 Java 类,例如 ElasticsearchConnection.java,并编写以下代码:
  1. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  2. import co.elastic.clients.elasticsearch.core.InfoResponse;
  3. import co.elastic.clients.transport.rest_client.RestClientTransport;
  4. import co.elastic.clients.json.jackson.JacksonJsonpMapper;
  5. import org.apache.http.HttpHost;
  6. import org.elasticsearch.client.RestClient;
  7. public class ElasticsearchConnection {
  8.     public static void main(String[] args) throws Exception {
  9.         // 创建 REST 客户端
  10.         RestClient restClient = RestClient.builder(
  11.                 new HttpHost("localhost", 9200, "http")).build();
  12.         // 创建传输层
  13.         RestClientTransport transport = new RestClientTransport(
  14.                 restClient, new JacksonJsonpMapper());
  15.         // 创建 Elasticsearch 客户端
  16.         ElasticsearchClient client = new ElasticsearchClient(transport);
  17.         // 获取集群信息
  18.         InfoResponse info = client.info();
  19.         System.out.println("Connected to Elasticsearch cluster: " + info.clusterName());
  20.         // 关闭客户端
  21.         transport.close();
  22.     }
  23. }
复制代码
3.2 运行代码

编译并运行这个步伐,假如乐成,你将看到类似如下的输出:
  1. Connected to Elasticsearch cluster: elasticsearch
复制代码
这表明你已经乐成连接到了 Elasticsearch。
4. 基本 CRUD 操作

Elasticsearch 的 CRUD 操作重要涉及对索引中的文档进行增(Create)、查(Read)、改(Update)、删(Delete)操作。
4.1 创建索引和插入文档

  1. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  2. import co.elastic.clients.elasticsearch.core.IndexResponse;
  3. import co.elastic.clients.transport.rest_client.RestClientTransport;
  4. import co.elastic.clients.json.jackson.JacksonJsonpMapper;
  5. import org.apache.http.HttpHost;
  6. import org.elasticsearch.client.RestClient;
  7. import co.elastic.clients.elasticsearch.core.IndexRequest;
  8. public class ElasticsearchCRUD {
  9.     public static void main(String[] args) throws Exception {
  10.         // 创建 REST 客户端
  11.         RestClient restClient = RestClient.builder(
  12.                 new HttpHost("localhost", 9200, "http")).build();
  13.         // 创建传输层
  14.         RestClientTransport transport = new RestClientTransport(
  15.                 restClient, new JacksonJsonpMapper());
  16.         // 创建 Elasticsearch 客户端
  17.         ElasticsearchClient client = new ElasticsearchClient(transport);
  18.         // 创建文档
  19.         String json = "{ "name": "John Doe", "age": 30, "city": "New York" }";
  20.         // 插入文档到索引
  21.         IndexRequest<Object> request = new IndexRequest.Builder<>()
  22.             .index("users")
  23.             .id("1")
  24.             .document(json)
  25.             .build();
  26.         IndexResponse response = client.index(request);
  27.         System.out.println("Document inserted with ID: " + response.id());
  28.         // 关闭客户端
  29.         transport.close();
  30.     }
  31. }
复制代码
4.2 查询文档

  1. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  2. import co.elastic.clients.elasticsearch.core.GetResponse;
  3. import co.elastic.clients.transport.rest_client.RestClientTransport;
  4. import co.elastic.clients.json.jackson.JacksonJsonpMapper;
  5. import org.apache.http.HttpHost;
  6. import org.elasticsearch.client.RestClient;
  7. import co.elastic.clients.elasticsearch.core.GetRequest;
  8. public class ElasticsearchRead {
  9.     public static void main(String[] args) throws Exception {
  10.         RestClient restClient = RestClient.builder(
  11.                 new HttpHost("localhost", 9200, "http")).build();
  12.         RestClientTransport transport = new RestClientTransport(
  13.                 restClient, new JacksonJsonpMapper());
  14.         ElasticsearchClient client = new ElasticsearchClient(transport);
  15.         // 查询文档
  16.         GetRequest getRequest = new GetRequest.Builder()
  17.                 .index("users")
  18.                 .id("1")
  19.                 .build();
  20.         GetResponse<Object> response = client.get(getRequest, Object.class);
  21.         if (response.found()) {
  22.             System.out.println("Document found: " + response.source());
  23.         } else {
  24.             System.out.println("Document not found");
  25.         }
  26.         transport.close();
  27.     }
  28. }
复制代码
4.3 更新文档

  1. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  2. import co.elastic.clients.elasticsearch.core.UpdateResponse;
  3. import co.elastic.clients.transport.rest_client.RestClientTransport;
  4. import co.elastic.clients.json.jackson.JacksonJsonpMapper;
  5. import org.apache.http.HttpHost;
  6. import org.elasticsearch.client.RestClient;
  7. import co.elastic.clients.elasticsearch.core.UpdateRequest;
  8. import java.util.Map;
  9. public class ElasticsearchUpdate {
  10.     public static void main(String[] args) throws Exception {
  11.         RestClient restClient = RestClient.builder(
  12.                 new HttpHost("localhost", 9200, "http")).build();
  13.         RestClientTransport transport = new RestClientTransport(
  14.                 restClient, new JacksonJsonpMapper());
  15.         ElasticsearchClient client = new ElasticsearchClient(transport);
  16.         // 更新文档
  17.         Map<String, Object> updateJson = Map.of(
  18.                 "age", 31,
  19.                 "city", "San Francisco"
  20.         );
  21.         UpdateRequest<Object, Map<String, Object>> updateRequest = new UpdateRequest.Builder<>()
  22.                 .index("users")
  23.                 .id("1")
  24.                 .doc(updateJson)
  25.                 .build();
  26.         UpdateResponse<Object> updateResponse = client.update(updateRequest, Object.class);
  27.         System.out.println("Document updated: " + updateResponse.result());
  28.         transport.close();
  29.     }
  30. }
复制代码
4.4 删除文档

  1. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  2. import co.elastic.clients.elasticsearch.core.DeleteResponse;
  3. import co.elastic.clients.transport.rest_client.RestClientTransport;
  4. import co.elastic.clients.json.jackson.JacksonJsonpMapper;
  5. import org.apache.http.HttpHost;
  6. import org.elasticsearch.client.RestClient;
  7. import co.elastic.clients.elasticsearch.core.DeleteRequest;
  8. public class ElasticsearchDelete {
  9.     public static void main(String[] args) throws Exception {
  10.         RestClient restClient = RestClient.builder(
  11.                 new HttpHost("localhost", 9200, "http")).build();
  12.         RestClientTransport transport = new RestClientTransport(
  13.                 restClient, new JacksonJsonpMapper());
  14.         ElasticsearchClient client = new ElasticsearchClient(transport);
  15.         // 删除文档
  16.         DeleteRequest deleteRequest = new DeleteRequest.Builder()
  17.                 .index("users")
  18.                 .id("1")
  19.                 .build();
  20.         DeleteResponse deleteResponse = client.delete(deleteRequest);
  21.         System.out.println("Document deleted: " + deleteResponse.result());
  22.         transport.close();
  23.     }
  24. }
复制代码
5. 复杂查询操作

Elasticsearch 提供了强大的查询 DSL(Domain Specific Language),支持布尔查询、范围查询、聚合查询等。
5.1 布尔查询

  1. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  2. import co.elastic.clients.elasticsearch.core.SearchResponse;
  3. import co.elastic.clients.elasticsearch.core.search.Hit;
  4. import co.elastic.clients.transport.rest_client.RestClientTransport;
  5. import co.elastic.clients.json.jackson.JacksonJsonpMapper;
  6. import org.apache.http.HttpHost;
  7. import org.elasticsearch.client.RestClient;
  8. import co.elastic.clients.elasticsearch.core.SearchRequest;
  9. import co.elastic.clients.elasticsearch.core.search.Query;
  10. public class ElasticsearchBooleanQuery {
  11.     public static void main(String[] args) throws Exception {
  12.         RestClient restClient = RestClient.builder(
  13.                 new HttpHost("localhost", 9200, "http")).build();
  14.         RestClientTransport transport = new RestClientTransport(
  15.                 restClient, new JacksonJsonpMapper());
  16.         ElasticsearchClient client = new ElasticsearchClient(transport);
  17.         // 布尔查询
  18.         SearchRequest searchRequest = new SearchRequest.Builder()
  19.                 .index("users")
  20.                 .query(Query
  21.                 .bool(b -> b
  22.                     .must(m -> m.match(match -> match.field("name").query("John Doe")))
  23.                     .filter(f -> f.range(r -> r.field("age").gte(30)))
  24.                 ))
  25.                 .build();
  26.         SearchResponse<Object> searchResponse = client.search(searchRequest, Object.class);
  27.         for (Hit<Object> hit : searchResponse.hits().hits()) {
  28.             System.out.println("Document found: " + hit.source());
  29.         }
  30.         transport.close();
  31.     }
  32. }
复制代码
5.2 范围查询

  1. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  2. import co.elastic.clients.elasticsearch.core.SearchResponse;
  3. import co.elastic.clients.elasticsearch.core.search.Hit;
  4. import co.elastic.clients.transport.rest_client.RestClientTransport;
  5. import co.elastic.clients.json.jackson.JacksonJsonpMapper;
  6. import org.apache.http.HttpHost;
  7. import org.elasticsearch.client.RestClient;
  8. import co.elastic.clients.elasticsearch.core.SearchRequest;
  9. import co.elastic.clients.elasticsearch.core.search.Query;
  10. public class ElasticsearchRangeQuery {
  11.     public static void main(String[] args) throws Exception {
  12.         RestClient restClient = RestClient.builder(
  13.                 new HttpHost("localhost", 9200, "http")).build();
  14.         RestClientTransport transport = new RestClientTransport(
  15.                 restClient, new JacksonJsonpMapper());
  16.         ElasticsearchClient client = new ElasticsearchClient(transport);
  17.         // 范围查询:查询 age 在 25 到 35 之间的文档
  18.         SearchRequest searchRequest = new SearchRequest.Builder()
  19.                 .index("users")
  20.                 .query(Query.range(r -> r.field("age").gte(25).lte(35)))
  21.                 .build();
  22.         SearchResponse<Object> searchResponse = client.search(searchRequest, Object.class);
  23.         for (Hit<Object> hit : searchResponse.hits().hits()) {
  24.             System.out.println("Document found: " + hit.source());
  25.         }
  26.         transport.close();
  27.     }
  28. }
复制代码
6. 索引管理与优化

在 Elasticsearch 中,索引管理是非常重要的操作,合理的索引设置和优化可以大幅提升查询性能。
6.1 创建索引并设置映射

  1. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  2. import co.elastic.clients.elasticsearch.indices.CreateIndexResponse;
  3. import co.elastic.clients.transport.rest_client.RestClientTransport;
  4. import co.elastic.clients.json.jackson.JacksonJsonpMapper;
  5. import org.apache.http.HttpHost;
  6. import org.elasticsearch.client.RestClient;
  7. import co.elastic.clients.elasticsearch.indices.CreateIndexRequest;
  8. public class ElasticsearchCreateIndex {
  9.     public static void main(String[] args) throws Exception {
  10.         RestClient restClient = RestClient.builder(
  11.                 new HttpHost("localhost", 9200, "http")).build();
  12.         RestClientTransport transport = new RestClientTransport(
  13.                 restClient, new JacksonJsonpMapper());
  14.         ElasticsearchClient client = new ElasticsearchClient(transport);
  15.         // 创建索引并设置映射
  16.         CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder()
  17.                 .index("users")
  18.                 .mappings(m -> m
  19.                     .properties("name", p -> p.text(t -> t))
  20.                     .properties("age", p -> p.integer(i -> i))
  21.                     .properties("city", p -> p.text(t -> t))
  22.                 )
  23.                 .build();
  24.         CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest);
  25.         if (createIndexResponse.acknowledged()) {
  26.             System.out.println("Index created successfully!");
  27.         }
  28.         transport.close();
  29.     }
  30. }
复制代码
6.2 删除索引

  1. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  2. import co.elastic.clients.elasticsearch.indices.DeleteIndexResponse;
  3. import co.elastic.clients.transport.rest_client.RestClientTransport;
  4. import co.elastic.clients.json.jackson.JacksonJsonpMapper;
  5. import org.apache.http.HttpHost;
  6. import org.elasticsearch.client.RestClient;
  7. import co.elastic.clients.elasticsearch.indices.DeleteIndexRequest;
  8. public class ElasticsearchDeleteIndex {
  9.     public static void main(String[] args) throws Exception {
  10.         RestClient restClient = RestClient.builder(
  11.                 new HttpHost("localhost", 9200, "http")).build();
  12.         RestClientTransport transport = new RestClientTransport(
  13.                 restClient, new JacksonJsonpMapper());
  14.         ElasticsearchClient client = new ElasticsearchClient(transport);
  15.         // 删除索引
  16.         DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest.Builder()
  17.                 .index("users")
  18.                 .build();
  19.         DeleteIndexResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest);
  20.         if (deleteIndexResponse.acknowledged()) {
  21.             System.out.println("Index deleted successfully!");
  22.         }
  23.         transport.close();
  24.     }
  25. }
复制代码
7. 聚合操作

Elasticsearch 的聚合功能非常强大,可以或许对数据进行分组统计、计算平均值、最大值、最小值等操作。
7.1 聚合查询:计算年龄的平均值

  1. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  2. import co.elastic.clients.elasticsearch.core.SearchResponse;
  3. import co.elastic.clients.elasticsearch.core.search.Hit;
  4. import co.elastic.clients.elasticsearch.core.search.Aggregation;
  5. import co.elastic.clients.elasticsearch.core.search.Bucket;
  6. import co.elastic.clients.transport.rest_client.RestClientTransport;
  7. import co.elastic.clients.json.jackson.JacksonJsonpMapper;
  8. import org.apache.http.HttpHost;
  9. import org.elasticsearch.client.RestClient;
  10. import co.elastic.clients.elasticsearch.core.SearchRequest;
  11. public class ElasticsearchAggregation {
  12.     public static void main(String[] args) throws Exception {
  13.         RestClient restClient = RestClient.builder(
  14.                 new HttpHost("localhost", 9200, "http")).build();
  15.         RestClientTransport transport = new RestClientTransport(
  16.                 restClient, new JacksonJsonpMapper());
  17.         ElasticsearchClient client = new ElasticsearchClient(transport);
  18.         // 聚合查询:计算年龄的平均值
  19.         SearchRequest searchRequest = new SearchRequest.Builder()
  20.                 .index("users")
  21.                 .size(0)  // 不返回文档,只返回聚合结果
  22.                 .aggregations("average_age", a -> a.avg(avg -> avg.field("age")))
  23.                 .build();
  24.         SearchResponse<Object> searchResponse = client.search(searchRequest, Object.class);
  25.         double averageAge = searchResponse.aggregations().get("average_age").avg().value();
  26.         System.out.println("Average age: " + averageAge);
  27.         transport.close();
  28.     }
  29. }
复制代码
8. 总结

本教程详细介绍了如安在 Java 中使用 Elasticsearch,涵盖了连接、基本 CRUD 操作、复杂查询、索引管理和聚合操作等方面的内容。通过这些示例,开辟者可以一步步地掌握如安在 Java 项目中集成 Elasticsearch,并利用其强大的搜索和分析功能来构建高效的应用步伐。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表