利用 【Java】 集成 【Elasticsearch】:详细教程

打印 上一主题 下一主题

主题 1022|帖子 1022|积分 3066

Elasticsearch 是一个开源的分布式搜索引擎,它能够快速地存储、搜索和分析大量的文本数据。它基于 Apache Lucene 构建,广泛应用于日志分析、全文搜索、保举系统等场景。本文将详细介绍如安在 Java 项目中集成 Elasticsearch,包括如何配置、索引文档、查询数据、以及与 Elasticsearch 进行交互的常见操作。
1. 环境准备

在开始利用 Elasticsearch 之前,确保你已经安装了以下工具:

  • Elasticsearch:你可以通过 官方文档 下载并安装 Elasticsearch。
  • JDK:确保你已安装 Java 8 或更高版本。可以通过 java -version 下令检察 Java 版本。
  • Maven:Maven 是 Java 的构建工具,你可以通过 官网 安装它。
1.1 启动 Elasticsearch


  • 下载并解压 Elasticsearch。
  • 在解压目录中打开终端,运行以下下令启动 Elasticsearch:
  1. bin/elasticsearch
复制代码
默认环境下,Elasticsearch 会在 localhost:9200 上启动。如果启动成功,你应该能够通过浏览器或 curl 下令访问到它:
  1. curl -X GET "localhost:9200/"
复制代码
你会看到雷同如下的响应:
  1. {
  2.   "name" : "your-node-name",
  3.   "cluster_name" : "elasticsearch",
  4.   "cluster_uuid" : "some-uuid",
  5.   "version" : {
  6.     "number" : "7.x.x",
  7.     "build_flavor" : "default",
  8.     "build_type" : "deb",
  9.     "build_hash" : "somehash",
  10.     "build_date" : "2020-10-01T12:34:56.789Z",
  11.     "build_snapshot" : false,
  12.     "lucene_version" : "8.x.x",
  13.     "minimum_wire_compatibility_version" : "7.x.x",
  14.     "minimum_index_compatibility_version" : "7.x.x"
  15.   },
  16.   "tagline" : "You Know, for Search"
  17. }
复制代码

  • 这样,Elasticsearch 就已启动并运行。
2. 添加依赖

Elasticsearch 提供了多个官方客户端,常用的客户端有 RestHighLevelClientElasticsearch Java Client。在这篇文章中,我们将利用 RestHighLevelClient 来进行操作。
起首,确保在 Maven 的 pom.xml 文件中添加以下依赖:
  1. <dependencies>
  2.     <!-- Elasticsearch Rest High Level Client -->
  3.     <dependency>
  4.         <groupId>org.elasticsearch.client</groupId>
  5.         <artifactId>elasticsearch-rest-high-level-client</artifactId>
  6.         <version>7.10.0</version> <!-- 根据你本地的版本选择合适的版本 -->
  7.     </dependency>
  8.     <!-- Elasticsearch Core -->
  9.     <dependency>
  10.         <groupId>org.elasticsearch</groupId>
  11.         <artifactId>elasticsearch</artifactId>
  12.         <version>7.10.0</version>
  13.     </dependency>
  14.     <!-- Jackson用于JSON处理 -->
  15.     <dependency>
  16.         <groupId>com.fasterxml.jackson.core</groupId>
  17.         <artifactId>jackson-databind</artifactId>
  18.         <version>2.10.3</version>
  19.     </dependency>
  20.     <!-- Log4j2 用于日志输出 -->
  21.     <dependency>
  22.         <groupId>org.apache.logging.log4j</groupId>
  23.         <artifactId>log4j-core</artifactId>
  24.         <version>2.13.3</version>
  25.     </dependency>
  26. </dependencies>
复制代码
3. 创建 Elasticsearch 客户端

在 Java 项目中利用 Elasticsearch,起首需要创建 RestHighLevelClient 客户端,它用于与 Elasticsearch 进行交互。
3.1 创建客户端

  1. import org.apache.http.HttpHost;
  2. import org.elasticsearch.client.RestClient;
  3. import org.elasticsearch.client.RestHighLevelClient;
  4. public class ElasticsearchClient {
  5.     public static RestHighLevelClient createClient() {
  6.         return new RestHighLevelClient(
  7.                 RestClient.builder(
  8.                         new HttpHost("localhost", 9200, "http")));
  9.     }
  10.     public static void main(String[] args) {
  11.         RestHighLevelClient client = createClient();
  12.         System.out.println("Elasticsearch client created successfully!");
  13.         // 不要忘记关闭客户端
  14.         try {
  15.             client.close();
  16.         } catch (IOException e) {
  17.             e.printStackTrace();
  18.         }
  19.     }
  20. }
复制代码


  • RestClient.builder(new HttpHost("localhost", 9200, "http")):通过 HttpHost 构建与 Elasticsearch 的毗连,指定服务器地址和端口。
  • client.close():关闭客户端毗连,释放资源。
4. 创建索引和添加文档

4.1 创建索引

在 Elasticsearch 中,数据被存储为文档,文档属于索引(雷同于数据库中的表)。我们起首创建一个索引,用于存储数据。
  1. import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
  2. import org.elasticsearch.client.RequestOptions;
  3. import org.elasticsearch.common.xcontent.XContentType;
  4. public class ElasticsearchExample {
  5.     public static void createIndex(RestHighLevelClient client) throws Exception {
  6.         CreateIndexRequest request = new CreateIndexRequest("my_index");
  7.         String jsonString = "{\n" +
  8.                 "  "settings": {\n" +
  9.                 "    "number_of_shards": 3,\n" +
  10.                 "    "number_of_replicas": 2\n" +
  11.                 "  },\n" +
  12.                 "  "mappings": {\n" +
  13.                 "    "properties": {\n" +
  14.                 "      "name": {"type": "text"},\n" +
  15.                 "      "age": {"type": "integer"},\n" +
  16.                 "      "joined": {"type": "date"}\n" +
  17.                 "    }\n" +
  18.                 "  }\n" +
  19.                 "}";
  20.         request.source(jsonString, XContentType.JSON);
  21.         client.indices().create(request, RequestOptions.DEFAULT);
  22.         System.out.println("Index 'my_index' created successfully.");
  23.     }
  24.     public static void main(String[] args) throws Exception {
  25.         RestHighLevelClient client = ElasticsearchClient.createClient();
  26.         createIndex(client);
  27.         client.close();
  28.     }
  29. }
复制代码


  • CreateIndexRequest 用于创建索引。
  • request.source 方法传入索引的设置(如分片数和副本数)以及映射界说(字段类型)。
  • 利用 client.indices().create() 创建索引。
4.2 添加文档

接下来,我们可以向索引中添加文档。
  1. import org.elasticsearch.action.index.IndexRequest;
  2. import org.elasticsearch.client.RequestOptions;
  3. import org.elasticsearch.index.IndexNotFoundException;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. public class ElasticsearchExample {
  7.     public static void addDocument(RestHighLevelClient client) throws Exception {
  8.         Map<String, Object> jsonMap = new HashMap<>();
  9.         jsonMap.put("name", "John Doe");
  10.         jsonMap.put("age", 29);
  11.         jsonMap.put("joined", "2024-11-06");
  12.         IndexRequest request = new IndexRequest("my_index")
  13.                 .id("1") // 文档 ID(可选)
  14.                 .source(jsonMap);
  15.         client.index(request, RequestOptions.DEFAULT);
  16.         System.out.println("Document added successfully.");
  17.     }
  18.     public static void main(String[] args) throws Exception {
  19.         RestHighLevelClient client = ElasticsearchClient.createClient();
  20.         addDocument(client);
  21.         client.close();
  22.     }
  23. }
复制代码


  • IndexRequest 用于构建要插入的文档。
  • request.source 接收一个 Map,包含要索引的字段和值。
  • client.index(request, RequestOptions.DEFAULT) 执行添加文档的操作。
5. 查询文档

5.1 基本查询

  1. import org.elasticsearch.action.search.SearchRequest;
  2. import org.elasticsearch.action.search.SearchResponse;
  3. import org.elasticsearch.index.query.QueryBuilders;
  4. import org.elasticsearch.search.builder.SearchSourceBuilder;
  5. import org.elasticsearch.search.hits.SearchHit;
  6. public class ElasticsearchExample {
  7.     public static void searchDocument(RestHighLevelClient client) throws Exception {
  8.         // 创建查询请求,指定要查询的索引
  9.         SearchRequest searchRequest = new SearchRequest("my_index");
  10.         // 使用 SearchSourceBuilder 构建查询条件
  11.         SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  12.         sourceBuilder.query(QueryBuilders.matchQuery("name", "John")); // 查找 name 字段包含 "John" 的文档
  13.         searchRequest.source(sourceBuilder);
  14.         // 执行查询
  15.         SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
  16.         // 打印查询结果
  17.         System.out.println("Search results: ");
  18.         for (SearchHit hit : response.getHits()) {
  19.             System.out.println(hit.getSourceAsString());  // 输出文档的 JSON 数据
  20.         }
  21.     }
  22.     public static void main(String[] args) throws Exception {
  23.         RestHighLevelClient client = ElasticsearchClient.createClient();
  24.         searchDocument(client);
  25.         client.close();
  26.     }
  27. }
复制代码
在上述代码中:


  • SearchRequest 用于指定查询的索引,这里是 "my_index"。
  • SearchSourceBuilder 用于构建查询体,我们利用 matchQuery 来查找 name 字段中包含 "John" 的文档。
  • client.search() 执行查询操作,返回 SearchResponse。
  • 通过 response.getHits() 获取查询结果,然后遍历 SearchHit 来输出每个匹配文档的内容。
5.2 高级查询:范围查询

Elasticsearch 支持多种类型的查询,好比范围查询。以下是一个范围查询的例子,用来查找年事大于 25 的所有文档:
  1. import org.elasticsearch.index.query.QueryBuilders;
  2. public class ElasticsearchExample {
  3.     public static void searchRange(RestHighLevelClient client) throws Exception {
  4.         SearchRequest searchRequest = new SearchRequest("my_index");
  5.         SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  6.         sourceBuilder.query(QueryBuilders.rangeQuery("age").gt(25)); // 查找 age > 25 的文档
  7.         searchRequest.source(sourceBuilder);
  8.         SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
  9.         System.out.println("Range search results: ");
  10.         for (SearchHit hit : response.getHits()) {
  11.             System.out.println(hit.getSourceAsString());
  12.         }
  13.     }
  14.     public static void main(String[] args) throws Exception {
  15.         RestHighLevelClient client = ElasticsearchClient.createClient();
  16.         searchRange(client);
  17.         client.close();
  18.     }
  19. }
复制代码
在这个例子中:


  • rangeQuery("age").gt(25) 表示查找 age 字段大于 25 的所有文档。
  • 你可以利用 lt()、gte()、lte() 等方法来设置差别的查询条件。
5.3 聚合查询

Elasticsearch 还支持聚合查询,用于盘算统计信息,例如盘算某个字段的平均值、总和等。下面是一个简单的聚合查询示例,盘算所有文档中年事字段的平均值。
  1. import org.elasticsearch.action.search.SearchRequest;
  2. import org.elasticsearch.action.search.SearchResponse;
  3. import org.elasticsearch.search.aggregations.AggregationBuilders;
  4. import org.elasticsearch.search.aggregations.terms.Terms;
  5. import org.elasticsearch.search.builder.SearchSourceBuilder;
  6. import org.elasticsearch.search.aggregations.Aggregation;
  7. public class ElasticsearchExample {
  8.     public static void aggregationExample(RestHighLevelClient client) throws Exception {
  9.         SearchRequest searchRequest = new SearchRequest("my_index");
  10.         SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  11.         // 聚合查询:计算 age 字段的平均值
  12.         sourceBuilder.aggregation(AggregationBuilders.avg("avg_age").field("age"));
  13.         searchRequest.source(sourceBuilder);
  14.         // 执行查询并获取响应
  15.         SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
  16.         // 输出聚合结果
  17.         Aggregation avgAggregation = response.getAggregations().get("avg_age");
  18.         double avgAge = ((org.elasticsearch.search.aggregations.metrics.Avg) avgAggregation).getValue();
  19.         System.out.println("Average age: " + avgAge);
  20.     }
  21.     public static void main(String[] args) throws Exception {
  22.         RestHighLevelClient client = ElasticsearchClient.createClient();
  23.         aggregationExample(client);
  24.         client.close();
  25.     }
  26. }
复制代码
在这个例子中:


  • AggregationBuilders.avg("avg_age").field("age") 创建了一个聚合,盘算所有文档中 age 字段的平均值。
  • 通过 response.getAggregations() 获取聚合结果,然后提取出盘算的平均值。
6. 更新和删除文档

6.1 更新文档

可以利用 UpdateRequest 来更新已存在的文档。这里我们演示如何更新文档中的某个字段:
  1. import org.elasticsearch.action.update.UpdateRequest;
  2. import org.elasticsearch.client.RequestOptions;
  3. import org.elasticsearch.common.xcontent.XContentType;
  4. public class ElasticsearchExample {
  5.     public static void updateDocument(RestHighLevelClient client) throws Exception {
  6.         UpdateRequest updateRequest = new UpdateRequest("my_index", "1"); // 指定索引和文档ID
  7.         String jsonString = "{ "doc": { "age": 30 } }"; // 更新内容:将 age 改为 30
  8.         updateRequest.doc(jsonString, XContentType.JSON);
  9.         client.update(updateRequest, RequestOptions.DEFAULT);
  10.         System.out.println("Document updated successfully.");
  11.     }
  12.     public static void main(String[] args) throws Exception {
  13.         RestHighLevelClient client = ElasticsearchClient.createClient();
  14.         updateDocument(client);
  15.         client.close();
  16.     }
  17. }
复制代码


  • UpdateRequest 用于指定要更新的文档 ID 和索引。
  • updateRequest.doc() 方法用于指定更新的字段和新值。
6.2 删除文档

你也可以利用 DeleteRequest 来删除文档:
  1. import org.elasticsearch.action.delete.DeleteRequest;
  2. public class ElasticsearchExample {
  3.     public static void deleteDocument(RestHighLevelClient client) throws Exception {
  4.         DeleteRequest deleteRequest = new DeleteRequest("my_index", "1"); // 指定要删除的文档 ID 和索引
  5.         client.delete(deleteRequest, RequestOptions.DEFAULT);
  6.         System.out.println("Document deleted successfully.");
  7.     }
  8.     public static void main(String[] args) throws Exception {
  9.         RestHighLevelClient client = ElasticsearchClient.createClient();
  10.         deleteDocument(client);
  11.         client.close();
  12.     }
  13. }
复制代码


  • DeleteRequest 用于删除指定 ID 的文档。






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

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

北冰洋以北

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