首页 > 编程语言 >使用 【Java】 集成 【Elasticsearch】:详细教程

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

时间:2024-11-06 17:15:25浏览次数:3  
标签:教程 文档 Java import client Elasticsearch org elasticsearch public

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

1. 环境准备

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

  1. Elasticsearch:你可以通过 官方文档 下载并安装 Elasticsearch。
  2. JDK:确保你已安装 Java 8 或更高版本。可以通过 java -version 命令查看 Java 版本。
  3. Maven:Maven 是 Java 的构建工具,你可以通过 官网 安装它。

1.1 启动 Elasticsearch

  1. 下载并解压 Elasticsearch。

  2. 在解压目录中打开终端,运行以下命令启动 Elasticsearch:

bin/elasticsearch

默认情况下,Elasticsearch 会在 localhost:9200 上启动。如果启动成功,你应该能够通过浏览器或 curl 命令访问到它:

curl -X GET "localhost:9200/"

你会看到类似如下的响应:

{
  "name" : "your-node-name",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "some-uuid",
  "version" : {
    "number" : "7.x.x",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "somehash",
    "build_date" : "2020-10-01T12:34:56.789Z",
    "build_snapshot" : false,
    "lucene_version" : "8.x.x",
    "minimum_wire_compatibility_version" : "7.x.x",
    "minimum_index_compatibility_version" : "7.x.x"
  },
  "tagline" : "You Know, for Search"
}
  1. 这样,Elasticsearch 就已启动并运行。

2. 添加依赖

Elasticsearch 提供了多个官方客户端,常用的客户端有 RestHighLevelClientElasticsearch Java Client。在这篇文章中,我们将使用 RestHighLevelClient 来进行操作。

首先,确保在 Maven 的 pom.xml 文件中添加以下依赖:

<dependencies>
    <!-- Elasticsearch Rest High Level Client -->
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.10.0</version> <!-- 根据你本地的版本选择合适的版本 -->
    </dependency>

    <!-- Elasticsearch Core -->
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>7.10.0</version>
    </dependency>

    <!-- Jackson用于JSON处理 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.10.3</version>
    </dependency>

    <!-- Log4j2 用于日志输出 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.13.3</version>
    </dependency>
</dependencies>

3. 创建 Elasticsearch 客户端

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

3.1 创建客户端

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;

public class ElasticsearchClient {
    public static RestHighLevelClient createClient() {
        return new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")));
    }

    public static void main(String[] args) {
        RestHighLevelClient client = createClient();
        System.out.println("Elasticsearch client created successfully!");

        // 不要忘记关闭客户端
        try {
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • RestClient.builder(new HttpHost("localhost", 9200, "http")):通过 HttpHost 构建与 Elasticsearch 的连接,指定服务器地址和端口。
  • client.close():关闭客户端连接,释放资源。

4. 创建索引和添加文档

4.1 创建索引

在 Elasticsearch 中,数据被存储为文档,文档属于索引(类似于数据库中的表)。我们首先创建一个索引,用于存储数据。

import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.xcontent.XContentType;

public class ElasticsearchExample {

    public static void createIndex(RestHighLevelClient client) throws Exception {
        CreateIndexRequest request = new CreateIndexRequest("my_index");
        String jsonString = "{\n" +
                "  \"settings\": {\n" +
                "    \"number_of_shards\": 3,\n" +
                "    \"number_of_replicas\": 2\n" +
                "  },\n" +
                "  \"mappings\": {\n" +
                "    \"properties\": {\n" +
                "      \"name\": {\"type\": \"text\"},\n" +
                "      \"age\": {\"type\": \"integer\"},\n" +
                "      \"joined\": {\"type\": \"date\"}\n" +
                "    }\n" +
                "  }\n" +
                "}";

        request.source(jsonString, XContentType.JSON);

        client.indices().create(request, RequestOptions.DEFAULT);
        System.out.println("Index 'my_index' created successfully.");
    }

    public static void main(String[] args) throws Exception {
        RestHighLevelClient client = ElasticsearchClient.createClient();
        createIndex(client);

        client.close();
    }
}
  • CreateIndexRequest 用于创建索引。
  • request.source 方法传入索引的设置(如分片数和副本数)以及映射定义(字段类型)。
  • 使用 client.indices().create() 创建索引。

4.2 添加文档

接下来,我们可以向索引中添加文档。

import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.index.IndexNotFoundException;

import java.util.HashMap;
import java.util.Map;

public class ElasticsearchExample {

    public static void addDocument(RestHighLevelClient client) throws Exception {
        Map<String, Object> jsonMap = new HashMap<>();
        jsonMap.put("name", "John Doe");
        jsonMap.put("age", 29);
        jsonMap.put("joined", "2024-11-06");

        IndexRequest request = new IndexRequest("my_index")
                .id("1") // 文档 ID(可选)
                .source(jsonMap);

        client.index(request, RequestOptions.DEFAULT);
        System.out.println("Document added successfully.");
    }

    public static void main(String[] args) throws Exception {
        RestHighLevelClient client = ElasticsearchClient.createClient();
        addDocument(client);

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

5. 查询文档

5.1 基本查询

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.hits.SearchHit;

public class ElasticsearchExample {

    public static void searchDocument(RestHighLevelClient client) throws Exception {
        // 创建查询请求,指定要查询的索引
        SearchRequest searchRequest = new SearchRequest("my_index");

        // 使用 SearchSourceBuilder 构建查询条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchQuery("name", "John")); // 查找 name 字段包含 "John" 的文档
        searchRequest.source(sourceBuilder);

        // 执行查询
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);

        // 打印查询结果
        System.out.println("Search results: ");
        for (SearchHit hit : response.getHits()) {
            System.out.println(hit.getSourceAsString());  // 输出文档的 JSON 数据
        }
    }

    public static void main(String[] args) throws Exception {
        RestHighLevelClient client = ElasticsearchClient.createClient();
        searchDocument(client);

        client.close();
    }
}

在上述代码中:

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

5.2 高级查询:范围查询

Elasticsearch 支持多种类型的查询,比如范围查询。以下是一个范围查询的例子,用来查找年龄大于 25 的所有文档:

import org.elasticsearch.index.query.QueryBuilders;

public class ElasticsearchExample {

    public static void searchRange(RestHighLevelClient client) throws Exception {
        SearchRequest searchRequest = new SearchRequest("my_index");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.rangeQuery("age").gt(25)); // 查找 age > 25 的文档
        searchRequest.source(sourceBuilder);

        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);

        System.out.println("Range search results: ");
        for (SearchHit hit : response.getHits()) {
            System.out.println(hit.getSourceAsString());
        }
    }

    public static void main(String[] args) throws Exception {
        RestHighLevelClient client = ElasticsearchClient.createClient();
        searchRange(client);

        client.close();
    }
}

在这个例子中:

  • rangeQuery("age").gt(25) 表示查找 age 字段大于 25 的所有文档。
  • 你可以使用 lt()gte()lte() 等方法来设置不同的查询条件。

5.3 聚合查询

Elasticsearch 还支持聚合查询,用于计算统计信息,例如计算某个字段的平均值、总和等。下面是一个简单的聚合查询示例,计算所有文档中年龄字段的平均值。

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.terms.Terms;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.aggregations.Aggregation;

public class ElasticsearchExample {

    public static void aggregationExample(RestHighLevelClient client) throws Exception {
        SearchRequest searchRequest = new SearchRequest("my_index");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        // 聚合查询:计算 age 字段的平均值
        sourceBuilder.aggregation(AggregationBuilders.avg("avg_age").field("age"));
        searchRequest.source(sourceBuilder);

        // 执行查询并获取响应
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);

        // 输出聚合结果
        Aggregation avgAggregation = response.getAggregations().get("avg_age");
        double avgAge = ((org.elasticsearch.search.aggregations.metrics.Avg) avgAggregation).getValue();
        System.out.println("Average age: " + avgAge);
    }

    public static void main(String[] args) throws Exception {
        RestHighLevelClient client = ElasticsearchClient.createClient();
        aggregationExample(client);

        client.close();
    }
}

在这个例子中:

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

6. 更新和删除文档

6.1 更新文档

可以使用 UpdateRequest 来更新已存在的文档。这里我们演示如何更新文档中的某个字段:

import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.xcontent.XContentType;

public class ElasticsearchExample {

    public static void updateDocument(RestHighLevelClient client) throws Exception {
        UpdateRequest updateRequest = new UpdateRequest("my_index", "1"); // 指定索引和文档ID
        String jsonString = "{ \"doc\": { \"age\": 30 } }"; // 更新内容:将 age 改为 30
        updateRequest.doc(jsonString, XContentType.JSON);

        client.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println("Document updated successfully.");
    }

    public static void main(String[] args) throws Exception {
        RestHighLevelClient client = ElasticsearchClient.createClient();
        updateDocument(client);

        client.close();
    }
}
  • UpdateRequest 用于指定要更新的文档 ID 和索引。
  • updateRequest.doc() 方法用于指定更新的字段和新值。

6.2 删除文档

你也可以使用 DeleteRequest 来删除文档:

import org.elasticsearch.action.delete.DeleteRequest;

public class ElasticsearchExample {

    public static void deleteDocument(RestHighLevelClient client) throws Exception {
        DeleteRequest deleteRequest = new DeleteRequest("my_index", "1"); // 指定要删除的文档 ID 和索引
        client.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println("Document deleted successfully.");
    }

    public static void main(String[] args) throws Exception {
        RestHighLevelClient client = ElasticsearchClient.createClient();
        deleteDocument(client);

        client.close();
    }
}
  • DeleteRequest 用于删除指定 ID 的文档。

标签:教程,文档,Java,import,client,Elasticsearch,org,elasticsearch,public
From: https://blog.csdn.net/jhgj56/article/details/143575195

相关文章

  • Google play用visa虚拟信用卡下单教程
    GooglePay是简单快捷的付款服务,方便在网站和商店等结账。无论预订旅游行程、出外用餐、购买表演门票或想尝试新的体验,都不用再掏出钱包了。在网上或应用程式开始使用非常简单,只需新增付款卡,即可轻松付款。它服务包括GooglePlay图书,GooglePlay游戏,GooglePlay影视,GooglePla......
  • wxWidgets GUI设计教程 - 事件处理机制
    wxWidgetsGUI设计教程-事件处理机制目标在本教程中,我们将深入学习wxWidgets的事件处理机制。通过这一机制,我们可以响应用户的各种操作(如点击按钮、移动鼠标、按键等),并编写对应的代码逻辑。本教程内容包含事件处理基础、事件绑定与处理、事件传递机制等内容。将通过实例......
  • 基于Java的家庭理财系统app设计和实现
    目录:目录:博主介绍: 完整视频演示:你应该选择我技术栈介绍:需求分析:系统各功能实现一览:1.注册2.登录部分代码参考: 项目功能分析: 项目论文:源码获取:博主介绍: ......
  • 【问题解决】java.lang.SecurityException: JCE cannot authenticate the provider BC
    问题复现历史项目升级JDK(由1.7升级到8),进行加密/解密时出现报错java.lang.SecurityException:JCEcannotauthenticatetheproviderBC。问题原因Wikipa上查到JCE的描述如下:JavaCryptographyExtension(JCE)isanofficiallyreleasedStandardExtensiontotheJavaPl......
  • 最新植物大战僵尸杂交版最新版本2.5.1版,内置触屏+加速+全屏,附PC+安卓+iOS最全安装教程
    植物大战僵尸杂交版链接:https://pan.quark.cn/s/9f12779d1ebd在数字世界的幻境中,总有一些不朽的传奇,它们穿越时光的洪流,持续捕获玩家的眼球与热情。《植物大战僵尸》系列无疑是这股潮流中的佼佼者,以其独创的游戏机制、多彩的角色设计以及幽默诙谐的画风,赢得了无数玩家的倾心......
  • [Javascript] Iterate over Object
    const[a,b]={a:3,b:4,};console.log(a,b);//TypeError:{(intermediatevalue)(intermediatevalue)}isnotiterable Howtomakeitworkwithouttouchoriginalcode?Weneedtouse[Symbol.iterator]forObject.prototype;Object.prototype[Sym......
  • 渗透测试入门教程(非常详细),从零基础入门到精通,看完这一篇就够了_渗透测试教程
    什么是渗透测试渗透测试就是模拟真实黑客的攻击手法对目标网站或主机进行全面的安全评估,与黑客攻击不一样的是,渗透测试的目的是尽可能多地发现安全漏洞,而真实黑客攻击只要发现一处入侵点即可以进入目标系统。一名优秀的渗透测试工程师也可以认为是一个厉害的黑客,也可以被......
  • TextIn ParseX文档解析SDK工具新增Java版本
    TextInParseX通用文档解析是一款大模型友好的解析工具,支持将pdf文档、jpg、img图像等文件快速转换为markdown格式,支持各类表格、公式解析,帮助大语言模型的数据清洗和文档问答任务。此前,为了让用户获得文档解析引擎返回的丰富版面元素,我们推出了一系列的sdk函数(+link),包括目录树、......
  • Java 日期时间处理指南
    技术博客:Java日期时间处理指南在现代Java编程中,处理日期和时间是一个常见且重要的任务。Java提供了多种日期时间类和工具,帮助开发者高效地处理各种日期时间操作。本文将详细介绍Java中的日期时间类、计算时间间隔、时区处理、日期格式化和解析、日期时间计算、日期时间比较......
  • 【JAVA】Java基础—基础语法:数据类型(基本数据类型与引用数据类型)
    在Java编程中,数据类型是一个非常重要的概念,它决定了变量能够存储什么样的数据以及如何在内存中处理这些数据。Java是一种强类型语言,这意味着每个变量都必须声明其数据类型,并且在使用时必须遵循该类型的规则。数据类型主要分为两大类:基本数据类型和引用数据类型。理解这两种数......