Java中Elasticsearch完全指南:从零基础到实战应用
环境准备与基础概念
Elasticsearch 与关系型数据库核心概念对比
对于零基础读者,理解 Elasticsearch 的核心概念最直观的方式是与熟悉的关系型数据库进行类比。以下对比表清晰展示了两者核心组件的对应关系:
| Elasticsearch 概念 | 关系型数据库概念 | 说明 |
|---|---|---|
| 索引(Index) | 数据库(Database) | 存储相关文档的集合,相当于关系型数据库中的数据库 |
| 文档(Document) | 行(Row) | 索引中的一条数据记录,以 JSON 格式存储 |
| 映射(Mapping) | 表结构(Table Schema) | 定义文档字段的数据类型和属性,类似于表结构定义 |
| 字段(Field) | 列(Column) | 文档中的一个属性,对应表中的列 |
| 分片(Shard) | 无直接对应概念 | 将索引数据拆分后的物理存储单元,用于水平扩展 |
核心概念生活化解析
索引与分片机制
Elasticsearch 的索引可以类比为图书馆的藏书体系,而分片则如同图书馆的书架分区。一个大型索引(图书馆)会被拆分为多个分片(不同区域的书架),每个分片存储部分数据,这样既便于管理,又能提高查询效率。当数据量增长时,可以通过增加分片数量实现水平扩展,就像图书馆扩建新的书架区域一样。
节点与集群
节点是运行 Elasticsearch 服务的服务器实例,而集群则是多个节点的集合。可以将节点理解为图书馆的单个分馆,集群则是整个图书馆系统。多个分馆(节点)协同工作,共同存储和管理所有图书(数据),确保系统的高可用性和负载均衡。
环境搭建指南
Linux 系统
- 下载与解压
1# 下载 Elasticsearch 压缩包(以 8.10.4 版本为例) 2wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.4-linux-x86_64.tar.gz 3# 解压文件 4tar -zxvf elasticsearch-8.10.4-linux-x86_64.tar.gz 5cd elasticsearch-8.10.4
- 配置关键参数
编辑config/elasticsearch.yml文件,设置以下核心配置:
1# 集群名称,同一集群中的节点必须使用相同名称 2cluster.name: my-elasticsearch-cluster 3# 节点名称,每个节点应具有唯一名称 4node.name: node-1 5# 网络绑定地址,0.0.0.0 表示允许所有网络访问 6network.host: 0.0.0.0 7# 集群发现设置,单节点模式下设置为当前节点 8discovery.seed_hosts: [[1]()] 9cluster.initial_master_nodes: [[1]()]
- 启动服务
1# 切换到非 root 用户运行(Elasticsearch 不允许 root 用户直接运行) 2su elasticsearch-user 3# 启动 Elasticsearch 4./bin/elasticsearch
成功启动后,终端会显示类似以下信息:
1[2025-10-18T02:27:17,522][INFO ][o.e.n.Node ] [node-1] started 2[2025-10-18T02:27:18,156][INFO ][o.e.c.m.MetadataClusterStateService] [node-1] cluster UUID [abc123]
Windows 系统
- 下载与解压
从 Elasticsearch 官网下载 Windows 版本压缩包,解压到本地目录(如D:\elasticsearch-8.10.4)。 - 配置关键参数
编辑config\elasticsearch.yml文件,配置内容与 Linux 系统相同。 - 启动服务
打开命令提示符,执行以下命令:
1cd D:\elasticsearch-8.10.4\bin 2elasticsearch.bat
macOS 系统
- 下载与解压
1curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.4-darwin-x86_64.tar.gz 2tar -zxvf elasticsearch-8.10.4-darwin-x86_64.tar.gz 3cd elasticsearch-8.10.4
- 配置与启动
配置文件修改与 Linux 系统一致,启动命令:
1./bin/elasticsearch
Java 环境配置
要在 Java 项目中使用 Elasticsearch,需通过 Maven 引入官方客户端依赖。以下是完整的 Maven 配置:
Maven 依赖配置
1<dependency> 2 <groupId>org.elasticsearch.client</groupId> 3 <artifactId>elasticsearch-rest-high-level-client</artifactId> 4 <version>8.10.4</version> 5</dependency> 6
版本兼容性说明:客户端版本必须与 Elasticsearch 服务端版本保持一致,否则可能出现兼容性问题。例如,服务端使用 8.10.4 版本,客户端也必须使用相同版本。
配置完成后,即可通过 Java 代码与 Elasticsearch 集群进行交互,包括创建索引、添加文档、执行查询等操作。
验证安装
安装完成后,可通过以下命令验证 Elasticsearch 是否正常运行:
1curl -X GET "http://localhost:9200/" 2
成功响应如下:
1{ 2 "name" : "node-1", 3 "cluster_name" : "my-elasticsearch-cluster", 4 "cluster_uuid" : "abc123", 5 "version" : { 6 "number" : "8.10.4", 7 "build_flavor" : "default", 8 "build_type" : "tar", 9 "build_hash" : "123456", 10 "build_date" : "2025-01-01T00:00:00.000Z", 11 "build_snapshot" : false, 12 "lucene_version" : "9.7.0", 13 "minimum_wire_compatibility_version" : "7.17.0", 14 "minimum_index_compatibility_version" : "7.0.0" 15 }, 16 "tagline" : "You Know, for Search" 17} 18
至此,Elasticsearch 环境已搭建完成,接下来可以开始进行索引创建、数据操作等实战应用。
核心API操作详解
连接:客户端初始化
Elasticsearch 客户端初始化与传统 JDBC 连接存在显著差异。JDBC 通常通过 DriverManager.getConnection() 建立数据库连接,而 Elasticsearch 客户端则需通过 RestClientBuilder 构建器配置连接参数后调用 build() 方法创建客户端实例。这种构建器模式允许开发者灵活设置节点地址、超时时间、认证信息等关键参数,以适应不同的集群环境需求。
配置要点:创建 RestClientBuilder 时需指定至少一个 Elasticsearch 节点地址,推荐设置连接超时和 socket 超时参数避免网络阻塞,生产环境中还应配置身份验证信息确保通信安全。
索引:映射配置与管理
索引管理的核心在于映射(Mapping)配置,它定义了文档字段的类型、分词方式等元数据。其中,text 类型与 keyword 类型的区别尤为关键:text 类型会对字段内容进行分词处理,适用于全文检索场景;keyword 类型则将字段视为整体,适用于精确匹配和聚合分析。以下是包含字段类型、分词器和权重设置的完整映射 JSON 示例:
1{ 2 "mappings": { 3 "properties": { 4 "product_name": { 5 "type": "text", 6 "analyzer": "ik_max_word", 7 "fields": { 8 "keyword": { 9 "type": "keyword", 10 "boost": 2.0 11 } 12 } 13 }, 14 "price": { "type": "double" }, 15 "category": { "type": "keyword" }, 16 "create_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" } 17 } 18 } 19} 20
文档:CRUD 操作与调用方式
文档操作包括创建、读取、更新和删除(CRUD),支持同步和异步两种调用方式。同步调用通过 index()、get() 等方法直接返回结果,适用于需要立即获取操作反馈的场景;异步调用则通过 indexAsync()、getAsync() 等方法结合回调函数处理结果,适合高并发场景以避免线程阻塞。以下是文档创建的同步调用示例:
1// 创建文档请求 2IndexRequest request = new IndexRequest("products"); 3request.id("1"); // 设置文档 ID 为 1,便于后续查询 4Product product = new Product("iPhone 15", 7999.0, "electronics"); 5request.source(objectMapper.writeValueAsString(product), XContentType.JSON); 6 7// 同步执行请求 8IndexResponse response = client.index(request, RequestOptions.DEFAULT); 9
查询:场景化查询与聚合分析
高级查询采用“场景+代码”的呈现方式,针对不同业务需求提供精准的查询实现。例如“商品价格区间查询”可通过 RangeQuery 实现,而聚合查询则常用于统计分析场景。以下是电商领域按商品分类统计数量的聚合查询示例:
1// 构建聚合查询 2SearchRequest searchRequest = new SearchRequest("products"); 3SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); 4TermsAggregationBuilder aggregation = AggregationBuilders.terms("by_category") 5 .field("category.keyword"); 6sourceBuilder.aggregation(aggregation); 7searchRequest.source(sourceBuilder); 8 9// 执行查询并解析结果 10SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); 11Terms terms = response.getAggregations().get("by_category"); 12for (Terms.Bucket bucket : terms.getBuckets()) { 13 System.out.println(bucket.getKeyAsString() + ": " + bucket.getDocCount()); 14} 15
上述代码执行后,预期返回类似以下 JSON 片段的聚合结果,展示各商品分类及其对应的文档数量:
1{ 2 "aggregations": { 3 "by_category": { 4 "buckets": [ 5 { "key": "electronics", "doc_count": 120 }, 6 { "key": "clothing", "doc_count": 85 } 7 ] 8 } 9 } 10} 11
响应解析要点:Elasticsearch 返回结果包含 hits 数组(命中文档)和 aggregations 对象(聚合结果),需根据查询类型选择对应解析方式。对于分页查询,可通过 from 和 size 参数控制返回数据量。
通过“连接-索引-文档-查询”的逻辑主线,开发者可系统性掌握 Elasticsearch 的核心 API 操作,结合具体业务场景灵活运用各类查询和聚合能力,构建高效的搜索引擎应用。
实战案例
本章节将以"商品搜索系统"为核心案例,采用"需求-设计-实现-测试"的完整开发流程,系统展示 Elasticsearch 在实际项目中的应用方法。通过对比传统数据库搜索方案的局限性,阐述 Elasticsearch 引入的必要性,并从架构设计到代码实现进行全方位解析。
需求背景与问题提出
在传统的商品搜索实现中,基于关系型数据库的模糊查询(如 LIKE '%关键词%')存在显著性能瓶颈:当商品数据量达到百万级时,全表扫描导致查询响应时间超过 3 秒;中文分词能力缺失使得"手机壳"无法匹配"保护壳 手机"等同义表述;排序功能局限于单一字段,无法实现基于销量、评分、价格的综合权重排序。这些痛点直接影响用户体验与系统扩展性,亟需引入专业的搜索引擎解决方案[1]。
系统架构设计
商品搜索系统采用分层架构设计,数据流向如下:商品信息通过 Kafka 消息队列从业务系统同步至 Elasticsearch 索引,应用服务层通过 RestHighLevelClient 与 Elasticsearch 集群交互,对外提供统一的搜索 API 接口。核心数据实体为 Product 类,其与 Elasticsearch 映射关系通过注解明确标注:
1@Data 2@Document(indexName = "products") 3public class Product { 4 @Id 5 private Long id; 6 7 @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart") 8 private String name; // 商品名称,使用IK分词器 9 10 @Field(type = FieldType.Keyword) 11 private String category; // 商品分类,不分词 12 13 @Field(type = FieldType.Double) 14 private BigDecimal price; // 商品价格 15 16 @Field(type = FieldType.Integer) 17 private Integer sales; // 销量 18 19 @Field(type = FieldType.Date, format = DateFormat.basic_date_time) 20 private LocalDateTime createTime; // 创建时间 21} 22
关键设计说明:
- 商品名称采用
ik_max_word分词器实现最大粒度分词,提升召回率 - 分类字段设为 Keyword 类型确保精确匹配
- 价格与销量字段用于排序权重计算
- 时间字段采用标准日期格式便于范围查询
核心实现方案
1. 客户端配置
采用单例模式实现 Elasticsearch 客户端,避免重复创建连接消耗资源:
1@Configuration 2public class EsClientConfig { 3 private static RestHighLevelClient client; 4 5 @Bean 6 public RestHighLevelClient getClient() { 7 if (client == null) { 8 synchronized (EsClientConfig.class) { 9 if (client == null) { 10 ClientConfiguration configuration = ClientConfiguration.builder() 11 .connectedTo("localhost:9200") 12 .withConnectTimeout(Duration.ofSeconds(5)) 13 .withSocketTimeout(Duration.ofSeconds(3)) 14 .build(); 15 client = RestClients.create(configuration).rest(); 16 } 17 } 18 } 19 return client; 20 } 21} 22
2. 服务层实现
服务层按功能分为索引操作、文档操作和查询操作三大模块,每个方法包含完整异常处理:
1@Service 2public class ProductSearchService { 3 @Autowired 4 private RestHighLevelClient client; 5 6 // 索引创建 7 public boolean createIndex() throws IOException { 8 if (client.indices().exists(new GetIndexRequest("products"), RequestOptions.DEFAULT)) { 9 log.warn("索引 [products] 已存在"); 10 return false; 11 } 12 // 索引创建逻辑... 13 return true; 14 } 15 16 // 文档批量导入 17 public BulkResponse batchImport(List<Product> products) throws IOException { 18 if (CollectionUtils.isEmpty(products)) { 19 throw new IllegalArgumentException("商品列表不能为空"); 20 } 21 // 批量导入逻辑... 22 } 23 24 // 综合搜索方法 25 public Page<Product> search(String keyword, String category, Integer page, Integer size) { 26 // 构建BoolQueryBuilder实现多条件查询 27 // 实现基于销量和价格的混合排序 28 // 分页处理... 29 } 30} 31
测试验证
测试类采用 JUnit 5 框架,通过 @BeforeEach 注解确保测试前索引初始化,提供"一键运行"的完整测试用例:
1@SpringBootTest 2public class ProductSearchTest { 3 @Autowired 4 private ProductSearchService searchService; 5 6 @BeforeEach 7 void setUp() throws IOException { 8 searchService.createIndex(); 9 searchService.batchImport(generateTestData()); 10 } 11 12 @Test 13 void testSearch() { 14 Page<Product> result = searchService.search("手机壳", "数码配件", 1, 10); 15 Assertions.assertEquals(5, result.getTotalElements()); 16 Assertions.assertTrue(result.getContent().get(0).getName().contains("手机壳")); 17 } 18} 19
运行测试时,控制台输出"index [products] created"表示索引创建成功;“bulk [products] processed: 100 documents"确认测试数据导入完成。通过调整关键词(如"保护套”)和分类参数,可验证 Elasticsearch 的分词与过滤效果。
差异化场景扩展
针对知识库检索等文本密集型场景,需进行特殊配置:在 pom.xml 中添加 IK 分词器依赖,并在 elasticsearch.yml 中配置扩展词典:
1plugin.mandatory: analysis-ik 2ik: 3 analyzer: 4 extend_dict: /usr/share/elasticsearch/config/ext.dic 5
相比商品搜索,知识库检索更依赖同义词扩展与语义相似度计算,建议增加 text_embedding 字段存储向量表示,结合向量搜索提升语义匹配能力。通过合理配置分词策略与索引结构,Elasticsearch 可灵活适应不同业务场景的检索需求。
常见问题与最佳实践
异常处理体系
连接类异常
问题现象:客户端初始化时抛出"Connection refused: no further information"错误,导致服务启动失败。
原因分析:Elasticsearch 服务未启动、网络端口未开放或防火墙拦截 9200/9300 端口通信。
解决方案:
- 检查服务状态:执行
systemctl status elasticsearch确认服务运行状态 - 验证网络连通性:使用
telnet es-node-1 9200测试端口可达性 - 调整客户端配置:
1RequestConfig requestConfig = RequestConfig.custom() 2 .setConnectTimeout(5000) // 连接超时设为 5 秒 3 .setSocketTimeout(30000) // socket 超时设为 30 秒 4 .build(); 5RestClientBuilder builder = RestClient.builder(new HttpHost("es-node-1", 9200)) 6 .setRequestConfigCallback(requestConfigBuilder -> requestConfig); 7
预防措施:实现服务健康检查机制,配置客户端自动重连策略,生产环境部署多节点集群实现故障转移。
索引类异常
问题现象:创建索引时返回"IndexAlreadyExistsException"异常,索引创建失败。
原因分析:目标索引名称已存在于集群中,或索引曾被删除但元数据未完全清理。
解决方案:
- 查询集群索引列表:
GET /_cat/indices?v确认索引状态 - 实现条件创建逻辑:
1if (!client.indices().exists(new GetIndexRequest("target-index"), RequestOptions.DEFAULT)) { 2 client.indices().create(new CreateIndexRequest("target-index"), RequestOptions.DEFAULT); 3} 4
预防措施:建立索引命名规范(如 logs-2025-10),使用时间戳或业务标识确保唯一性。
文档类异常
问题现象:执行文档更新操作时出现"DocumentNotFoundException",更新失败。
原因分析:指定 ID 的文档不存在,或操作前未验证文档状态。
解决方案:
- 执行存在性检查:
GET /target-index/_doc/1 - 使用乐观更新策略:
1Map<String, Object> jsonMap = new HashMap<>(); 2jsonMap.put("field", "new_value"); 3UpdateRequest request = new UpdateRequest("target-index", "1") 4 .doc(jsonMap) 5 .docAsUpsert(true); // 文档不存在时自动插入 6client.update(request, RequestOptions.DEFAULT); 7
预防措施:实现业务层文档状态校验,对关键操作添加日志审计。
性能优化策略
批量操作优化
性能对比:在标准服务器环境(4 核 8 GB 配置)下,1000 条文档插入性能测试显示:
- 单条操作:平均耗时 12.8 秒,网络往返次数 1000 次
- 批量操作(500 条/批):平均耗时 0.7 秒,网络往返次数 2 次,性能提升约 18 倍
实现示例:
1BulkRequest bulkRequest = new BulkRequest(); 2for (int i = 0; i < 1000; i++) { 3 Map<String, Object> doc = new HashMap<>(); 4 doc.put("id", i); 5 doc.put("content", "batch_test_" + i); 6 bulkRequest.add(new IndexRequest("logs-2025").source(doc)); 7} 8BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT); 9
适用场景:日志数据导入、历史数据迁移、全量索引重建等大批量写入场景,建议根据文档大小调整批次(5-15 MB/批为宜)。
索引设计优化
分片配置经验公式:主分片数 = CPU 核心数 × 2,副分片数建议设为 1-2 个。例如 8 核服务器推荐配置 16 个主分片 + 2 个副本,可最大化利用 CPU 资源并保证高可用。
字段映射优化:
- 对非查询字段设置
enabled: false - 对文本字段合理使用
keyword子字段 - 禁用不需要的字段分析器
1{ 2 "mappings": { 3 "properties": { 4 "raw_log": { "type": "text", "analyzer": "ik_max_word" }, 5 "log_id": { "type": "keyword" }, 6 "metadata": { "type": "object", "enabled": false } 7 } 8 } 9} 10
查询性能优化
Explain API 应用:通过 GET /target-index/_explain/1?q=content:test 分析查询执行计划,重点关注:
type字段确认查询类型(如term/match)description展示具体执行逻辑time_in_millis定位耗时环节
优化技巧:
- 使用过滤器(
filter)替代查询条件,利用缓存提升性能 - 避免通配符前缀查询(如
*test) - 对高频排序字段创建
fielddata或使用doc_values
生产环境配置
核心配置项(elasticsearch.yml)
1# 集群配置 2cluster.name: production-cluster 3node.name: es-node-1 4discovery.seed_hosts: [[1]()][[1]()][[1]()] 5cluster.initial_master_nodes: [[1]()] 6 7# 资源配置 8indices.memory.index_buffer_size: 20% 9node.memory.high_watermark.flood_stage: 90% 10thread_pool.write.queue_size: 1000 11 12# 安全配置 13xpack.security.enabled: true 14xpack.security.transport.ssl.enabled: true 15
Kibana 安装步骤
- 下载对应版本安装包:
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.11.3-linux-x86_64.tar.gz - 解压并配置:
1# kibana.yml 2server.port: 5601 3server.host: "0.0.0.0" 4elasticsearch.hosts: [[2](http://es-node-1:9200)] 5elasticsearch.username: "kibana_system" 6elasticsearch.password: "secure_password" 7
- 启动服务:
./bin/kibana --allow-root
安全原则:开发环境可临时禁用 xpack.security 简化配置,但生产环境必须启用 SSL/TLS 加密与基于角色的访问控制(RBAC),通过 elasticsearch-setup-passwords 命令设置内置用户密码。
监控与运维
- 启用监控:配置
xpack.monitoring.collection.enabled: true - 日志轮转:设置
logger.action: INFO, action避免日志文件过大 - 定期备份:使用
_snapshotAPI 创建索引快照,建议每日全量 + 增量备份策略
扩展学习资源与进阶方向
为帮助开发者系统性提升 Elasticsearch 技能,以下按“入门-进阶-专家”三级路径梳理学习资源与技术方向,结合 Java 生态特性提供实践指南。
分阶段学习资源体系
入门阶段以官方文档为核心,推荐 Elasticsearch 官方“Getting Started”指南(https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html),其通过交互式示例覆盖索引创建、文档 CRUD 等基础操作。书籍方面,《Elasticsearch实战》适合零基础读者,以场景化案例讲解分布式搜索原理;《深入理解Elasticsearch》则侧重底层机制,适合有一定基础后进阶阅读。
进阶技术对比
在 Java 客户端选择上,Spring Data Elasticsearch 提供 Repository 接口简化 CRUD 操作,通过注解映射实体与索引关系,大幅降低入门门槛,但在复杂聚合查询场景下灵活性受限。原生 REST Client(如 High Level REST Client)则支持完整 Elasticsearch API,适合构建高性能搜索服务,但需手动处理请求/响应序列化。建议根据项目复杂度选择:快速开发优先 Spring Data,性能敏感场景采用原生 Client。
Elasticsearch 8.x 对 Java 开发影响显著,核心变化包括:① TransportClient 彻底移除,强制使用 REST Client;② 安全特性默认启用,需通过 SSL/TLS 配置连接;③ 新增向量搜索 API,支持机器学习模型集成。迁移项目时需重点调整客户端初始化逻辑,示例代码如下:
1// Elasticsearch 8.x 客户端初始化示例 2RestClientBuilder builder = RestClient.builder( 3 new HttpHost("localhost", 9200, "https") 4).setHttpClientConfigCallback(httpClientBuilder -> 5 httpClientBuilder.setSSLContext(buildSSLContext()) 6); 7
性能调优与社区实践
诊断集群性能问题可使用内置 API:执行 GET _nodes/hot_threads 识别 CPU 密集型操作,通过 GET _cluster/allocation/explain 分析分片分配异常。社区资源方面,GitHub 项目 elasticsearch-sql 提供 SQL 查询能力,适合传统数据库开发者快速转型;国内技术社区如掘金、InfoQ 的 Elasticsearch 专栏定期更新实战案例,建议通过复现开源项目(如 Elasticsearch 官方 demo 仓库)提升 API 熟练度。
专家路径建议:深入研究 Lucene 底层索引结构(如倒排索引、FST),参与 Elastic 社区贡献(https://www.elastic.co/community),关注 Elasticsearch 9.x 路线图中的异步搜索、实时分析引擎等前沿特性。
持续学习需结合实际业务场景,例如电商搜索优化可重点突破相关性算法(BM25、DFR),日志分析场景则需掌握时序数据分片策略,通过问题驱动实现技术深度与业务价值的结合。
以下是Java操作Elasticsearch的核心API总结,按功能模块分类,便于快速查阅:
一、客户端连接
| 方法 | 功能 | 关键参数 |
|---|---|---|
| RestClient.builder() | 创建客户端构建器 | Elasticsearch节点地址(HttpHost) |
| setRequestConfigCallback() | 配置超时参数 | 连接超时、Socket超时 |
| build() | 生成客户端实例 | - |
| close() | 关闭客户端释放资源 | - |
示例:
1RestHighLevelClient client = new RestHighLevelClient( 2 RestClient.builder(new HttpHost("localhost", 9200, "http")) 3); 4
二、索引管理
| 方法 | 功能 | 关键参数 |
|---|---|---|
| indices().create() | 创建索引 | 索引名称、映射配置(CreateIndexRequest) |
| indices().exists() | 判断索引是否存在 | 索引名称(GetIndexRequest) |
| indices().putMapping() | 更新映射 | 索引名称、字段映射(PutMappingRequest) |
| indices().delete() | 删除索引 | 索引名称(DeleteIndexRequest) |
示例:
1// 创建索引并配置映射 2CreateIndexRequest request = new CreateIndexRequest("products"); 3request.mapping("{\n" + 4 " \"properties\": {\n" + 5 " \"name\": { \"type\": \"text\" }\n" + 6 " }\n" + 7"}", XContentType.JSON); 8client.indices().create(request, RequestOptions.DEFAULT); 9
三、文档操作
| 方法 | 功能 | 关键参数 |
|---|---|---|
| index() | 添加/更新文档 | 索引名称、文档ID、JSON数据(IndexRequest) |
| get() | 查询文档 | 索引名称、文档ID(GetRequest) |
| update() | 部分更新文档 | 索引名称、文档ID、更新字段(UpdateRequest) |
| delete() | 删除文档 | 索引名称、文档ID(DeleteRequest) |
| bulk() | 批量操作 | 批量请求(BulkRequest,含多个IndexRequest/DeleteRequest) |
示例:
1// 添加文档 2IndexRequest request = new IndexRequest("products").id("1"); 3request.source("{\"name\":\"iPhone 15\",\"price\":7999}", XContentType.JSON); 4client.index(request, RequestOptions.DEFAULT); 5
四、查询操作
| 方法 | 功能 | 关键参数 |
|---|---|---|
| search() | 执行搜索 | 索引名称、查询条件(SearchRequest+SearchSourceBuilder) |
| SearchSourceBuilder.query() | 设置查询条件 | 查询类型(TermQuery/MatchQuery/BoolQuery等) |
| setFrom()/setSize() | 分页 | 起始位置(from)、每页条数(size) |
| addSort() | 排序 | 排序字段、排序方向(SortOrder.ASC/DESC) |
| aggregation() | 聚合分析 | 聚合构建器(TermsAggregationBuilder等) |
示例:
1// 执行匹配查询 2SearchRequest request = new SearchRequest("products"); 3SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); 4sourceBuilder.query(QueryBuilders.matchQuery("name", "手机")); 5sourceBuilder.from(0).size(10); // 分页 6request.source(sourceBuilder); 7SearchResponse response = client.search(request, RequestOptions.DEFAULT); 8
五、核心查询类型
| 查询类型 | 用途 | 对应方法 |
|---|---|---|
| 精确匹配 | 关键词完全匹配 | QueryBuilders.termQuery(field, value) |
| 全文检索 | 分词后匹配文本 | QueryBuilders.matchQuery(field, text) |
| 多条件组合 | 与/或/非逻辑 | QueryBuilders.boolQuery() |
| 范围查询 | 数值/日期范围匹配 | QueryBuilders.rangeQuery(field).gt(value) |
| 聚合统计 | 分组/求和/平均值 | AggregationBuilders.terms(name).field(field) |
示例:
1// 多条件组合查询(价格>1000且分类为"手机") 2BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() 3 .must(QueryBuilders.rangeQuery("price").gt(1000)) 4 .filter(QueryBuilders.termQuery("category", "手机")); 5
六、异常处理
| 异常类型 | 常见原因 | 处理方式 |
|---|---|---|
| ElasticsearchException | 索引不存在、文档格式错误 | 捕获异常并提示具体错误信息 |
| IOException | 网络连接失败、超时 | 检查节点地址、调整超时参数 |
| ResponseException | 请求参数错误 | 打印响应体(e.getResponse().getStatusLine()) |
示例:
1try { 2 client.indices().create(request, RequestOptions.DEFAULT); 3} catch (ElasticsearchException e) { 4 if (e.status() == RestStatus.CONFLICT) { 5 log.error("索引已存在"); 6 } 7} 8
记忆口诀
“三建三查两操作”
- 三建:建客户端、建索引、建文档
- 三查:查索引、查文档、查数据
- 两操作:更新数据、删除资源
通过上述API,可完成Elasticsearch的大部分核心操作。实际使用时,建议结合具体业务场景选择合适的查询和聚合方法,并注意资源释放(如客户端关闭)。
《Java中Elasticsearch完全指南:从零基础到实战应用》 是转载文章,点击查看原文。