目录
2. 修改 Elasticsearch 配置文件(永久生效)
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基 于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布, 是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速, 安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他 语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是 Apache Solr,也是基于Lucene
重要特性:
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 实时分析的分布式搜索引擎
- 可以扩展到上百台服务器,处理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,实际使用中可根据需求扩展功能,探索更多高级特性。
有问题欢迎留言!!!😗
肥嘟嘟左卫门就讲到这里啦,记得一键三连!!!😗