ElasticSearch安装及使用教程

目录

环境安装(小编也在评论区发了ES和IK分词器的安装包)

Windows版ES下载

Windows版ES安装与启动

 常见问题以及解决方案(方法任选其一即可)

"warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME" Future versions of Elasticsearch will require Java 11; your Java version from [D:\Java\jdk-1.8\jre] does not meet this requirement.

解决方案

1. 设置 ES_JAVA_HOME 环境变量(推荐)

2. 修改 Elasticsearch 配置文件(永久生效)

3. 最简单的一步到位方案

验证是否使用正确JDK

"warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME" Exception in thread "main" org.elasticsearch.bootstrap.BootstrapException: java.nio.file.FileAlreadyExistsException: D:\qq\Monkey\elasticsearch-7.16.2\config\elasticsearch.keystore.tmp

解决方案

1.删除临时文件

2.如果步骤1无效,删除并重新创建密钥库

3.设置 ES_JAVA_HOME 环境变量

IK分词器

分词器的作用是什么?

IK分词器有几种模式?

安装

案例

代码说明


Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基 于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布, 是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速, 安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他 语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是 Apache Solr,也是基于Lucene

重要特性:

  1. 分布式的实时文件存储,每个字段都被索引并可被搜索
  2. 实时分析的分布式搜索引擎
  3. 可以扩展到上百台服务器,处理PB级结构化或非结构化数据

环境安装(小编也在评论区发了ES和IK分词器的安装包)

Windows版ES下载

https://www.elastic.co/cn/downloads/elasticsearch

Windows版ES安装与启动

  • 运行 elasticsearch.bat
  • 访问localhost:9200能看到json代表启动成功

方式1

切换到ES的bin目录下在文件路径这一栏输入cmd回车进入终端,运行 elasticsearch.bat

方式2

快捷键win+R,输入cmd之后,按住Ctrl+Shift+Enter以管理员身份进入终端(小编建议以管理员身份运行,否则可能会因权限问题报错)通过命令cd切换到ES的bin路径下,运行 elasticsearch.bat

 常见问题以及解决方案(方法任选其一即可)

"warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME" Future versions of Elasticsearch will require Java 11; your Java version from [D:\Java\jdk-1.8\jre] does not meet this requirement.

如果你的终端输出这样的错误信息,其实是因为Java 版本问题 - Elasticsearch 7.16.2 需要 Java 11,但你使用的是其他的版本,小编不建议为了ES下载Java 11。

Elasticsearch 7.16.2 自带了 JDK,不需要额外下载 Java 11

解决方案

1. 设置 ES_JAVA_HOME 环境变量(推荐)

在当前命令行窗口中临时设置:

 然后删除临时文件并启动:

del 你的ES路径\elasticsearch-7.16.2\config\elasticsearch.keystore.tmp
D:你的ES路径\elasticsearch-7.16.2\bin\elasticsearch.bat

如果删除失败(找不到该文件),就删除相关文件(不加.tmp后缀),类似如下

D:\qq\Monkey\elasticsearch-7.16.2>del D:\qq\Monkey\elasticsearch-7.16.2\config\elasticsearch.keystore.tmp
找不到 D:\qq\Monkey\elasticsearch-7.16.2\config\elasticsearch.keystore.tmp

//删除相关文件
D:\qq\Monkey\elasticsearch-7.16.2>del D:\qq\Monkey\elasticsearch-7.16.2\config\elasticsearch.keystore

删除之后切换到bin目录下,重新创建密钥文件,弹出warning没关系,是因为我们没有设置ES_JAVA_HOME

D:\qq\Monkey\elasticsearch-7.16.2>cd D:\qq\Monkey\elasticsearch-7.16.2\bin

D:\qq\Monkey\elasticsearch-7.16.2\bin>elasticsearch-keystore create
"warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME"
Future versions of Elasticsearch will require Java 11; your Java version from [D:\Java\jdk-1.8\jre] does not meet this requirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.
Created elasticsearch keystore in D:\qq\Monkey\elasticsearch-7.16.2\config\elasticsearch.keystore

设置ES_JAVA_HOME,使用Elasticsearch 7.16.2 自带了 JDK,不需要额外下载 Java 11

在浏览器输入localhost:9200,页面输出JSON,那你的ES就启动成功了

D:\qq\Monkey\elasticsearch-7.16.2\bin>set ES_JAVA_HOME=D:\qq\Monkey\elasticsearch-7.16.2\jdk

2. 修改 Elasticsearch 配置文件(永久生效)

编辑 D:你的ES路径\elasticsearch-7.16.2\config\jvm.options 文件,在文件开头添加:

# 设置使用 Elasticsearch 自带的 JDK
-Djava.home=D:你的ES路径/elasticsearch-7.16.2/jdk

或者创建/编辑 D:你的ES路径\elasticsearch-7.16.2\bin\elasticsearch-env.bat(以记事本或编辑器的方式打开),找到设置 Java 路径的部分,修改为:

if defined ES_JAVA_HOME (
  set JAVA=%ES_JAVA_HOME%\bin\java.exe
  set JAVA_TYPE=ES_JAVA_HOME
) else if defined JAVA_HOME (
  rem 注释掉这部分,或者修改为使用自带JDK
  rem set JAVA=%JAVA_HOME%\bin\java.exe
  set JAVA=%ES_HOME%\jdk\bin\java.exe
  set JAVA_TYPE=embedded
) else (
  set JAVA=%ES_HOME%\jdk\bin\java.exe
  set JAVA_TYPE=embedded
)

3. 最简单的一步到位方案

# 在当前命令行中执行:
set ES_JAVA_HOME=D:你的ES路径\elasticsearch-7.16.2\jdk
del D:你的ES路径\elasticsearch-7.16.2\config\elasticsearch.keystore.tmp
D:你的ES路径\elasticsearch-7.16.2\bin\elasticsearch.bat

验证是否使用正确JDK

启动后,你可以在日志中看到类似这样的信息:

Java version: 11.0.13, vendor: AdoptOpenJDK, runtime:
D:你的ES路径\elasticsearch-7.16.2\jdk

解决方案任选其一就好,其实还有一种解决方案小编不建议大家使用,就是将环境配置中的JAVA_HOME改成Elasticsearch自带的JDK。如果修改了,会影响其他Java应用程序

这样就既能保持你的系统 JAVA_HOME 不变,又能让 Elasticsearch 使用自带的 JDK 11了!

"warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME" Exception in thread "main" org.elasticsearch.bootstrap.BootstrapException: java.nio.file.FileAlreadyExistsException: D:\qq\Monkey\elasticsearch-7.16.2\config\elasticsearch.keystore.tmp

如果你的终端输出这样的错误信息,是因为存在残留的临时密钥库文件。

解决方案

1.删除临时文件

del D:你的ES路径\elasticsearch-7.16.2\config\elasticsearch.keystore.tmp

2.如果步骤1无效,删除并重新创建密钥库

# 删除所有相关文件
del 你的ES路径\elasticsearch-7.16.2\config\elasticsearch.keystore
del 你的ES路径\elasticsearch-7.16.2\config\elasticsearch.keystore.tmp

# 重新创建密钥库
cd 你的ES路径\elasticsearch-7.16.2\bin
elasticsearch-keystore create

3.设置 ES_JAVA_HOME 环境变量

set ES_JAVA_HOME=D:你的ES路径/elasticsearch-7.16.2/jdk  #替换成elasticsearc自带的JDK

IK分词器

分词器的作用是什么?

创建倒排索引时对文档分词 用户搜索时,对输入的内容分词

IK分词器有几种模式?

  • ik_smart:智能切分,粗粒度
  • ik_max_word:最细切分,细粒度

安装

下载:https://github.com/medcl/elasticsearch-analysis-ik/releases

  • 在ES安装目录下找到plugins目录创建ik文件夹
  • 将ik分词器解压缩在此目录并重启ES即可

案例

以下是一个使用 Java 操作 Elasticsearch 的简单案例,包含连接 ES、创建索引、添加文档、查询文档等基础操作。这个案例基于 Elasticsearch 官方的 Java High Level REST Client,适合刚启动好 ES 后进行入门测试。

代码说明

依赖准备

  • 要运行此代码,需要在项目中添加 Elasticsearch 客户端依赖(以 Maven 为例):
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.16.2</version> <!-- 版本需与你的ES服务器一致 -->
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.16.2</version>
</dependency>

核心操作

  • 连接 ES:通过 RestHighLevelClient 连接本地 9200 端口的 ES 服务
  • 创建索引:判断索引是否存在,不存在则创建(示例中使用默认配置,实际可添加映射)
  • 添加文档:向索引中插入一条 JSON 格式的酒店数据
  • 查询文档:包含 “查询所有文档” 和 “按条件查询” 两种常见查询方式

运行注意事项

  • 确保 ES 服务已启动(可通过 localhost:9200 访问)
  • 客户端版本需与 ES 服务器版本一致(示例中使用 7.16.2)
  • 运行后可在控制台看到操作结果,也可通过 Kibana 或 Postman 查看索引和文档是否创建成功
import org.apache.http.HttpHost;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;

public class ElasticsearchDemo {
    // 初始化ES客户端
    private static RestHighLevelClient getClient() {
        return new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
    }

    public static void main(String[] args) throws IOException {
        // 获取客户端连接
        RestHighLevelClient client = getClient();

        try {
            // 1. 创建索引(如果不存在)
            // 注意:如果之前通过测试代码创建过"hotels"索引,可以跳过这一步
            createIndex(client, "hotels");

            // 2. 添加文档(示例:添加一条酒店数据)
            String hotelJson = "{\n" +
                    "  \"id\": \"1001\",\n" +
                    "  \"name\": \"北京王府井酒店\",\n" +
                    "  \"price\": 699,\n" +
                    "  \"city\": \"北京\",\n" +
                    "  \"brand\": \"王府井\"\n" +
                    "}";
            addDocument(client, "hotels", "1001", hotelJson);

            // 3. 查询文档(查询所有酒店)
            searchAllDocuments(client, "hotels");

            // 4. 条件查询(查询北京的酒店)
            searchByCondition(client, "hotels", "city", "北京");

        } finally {
            // 关闭客户端
            client.close();
        }
    }

    // 创建索引
    private static void createIndex(RestHighLevelClient client, String indexName) throws IOException {
        // 判断索引是否已存在
        boolean exists = client.indices().exists(
                new org.elasticsearch.client.indices.GetIndexRequest(indexName),
                RequestOptions.DEFAULT
        );
        if (!exists) {
            // 创建索引(这里使用简单配置,实际可添加映射)
            client.indices().create(
                    new org.elasticsearch.client.indices.CreateIndexRequest(indexName),
                    RequestOptions.DEFAULT
            );
            System.out.println("索引 " + indexName + " 创建成功");
        } else {
            System.out.println("索引 " + indexName + " 已存在");
        }
    }

    // 添加文档
    private static void addDocument(RestHighLevelClient client, String indexName, String id, String jsonData) throws IOException {
        IndexRequest request = new IndexRequest(indexName);
        request.id(id); // 设置文档ID
        request.source(jsonData, XContentType.JSON); // 设置文档内容

        IndexResponse response = client.index(request, RequestOptions.DEFAULT);
        System.out.println("文档添加结果:" + response.getResult());
    }

    // 查询所有文档
    private static void searchAllDocuments(RestHighLevelClient client, String indexName) throws IOException {
        SearchRequest request = new SearchRequest(indexName);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchAllQuery()); // 匹配所有文档
        request.source(sourceBuilder);

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        System.out.println("\n查询所有文档结果:");
        for (SearchHit hit : response.getHits().getHits()) {
            System.out.println(hit.getSourceAsString());
        }
    }

    // 条件查询(根据字段匹配)
    private static void searchByCondition(RestHighLevelClient client, String indexName, String field, String value) throws IOException {
        SearchRequest request = new SearchRequest(indexName);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.termQuery(field, value)); // 精确匹配字段值
        request.source(sourceBuilder);

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        System.out.println("\n查询 " + field + "=" + value + " 的结果:");
        for (SearchHit hit : response.getHits().getHits()) {
            System.out.println(hit.getSourceAsString());
        }
    }
}

希望以上内容能助你快速上手 Elasticsearch,实际使用中可根据需求扩展功能,探索更多高级特性。

有问题欢迎留言!!!😗

肥嘟嘟左卫门就讲到这里啦,记得一键三连!!!😗

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值