如何快捷的判断一批索引中不存在的或 close 的索引

本文介绍了如何在Elasticsearch中处理查询多个索引时遇到的问题,包括索引不存在或关闭的情况,并提供了检查索引存在性和状态的方法。

Elasticsearch查询多个索引时,如果其中某个索引不存在或close,则该查询直接返回 ”404 索引丢失“ 错误

如:

GET /ocslog-2016.08.03,ocslog-2016.08.04,ocslog-2016.08.05,ocslog-2016.08.06/_search

假如:ocslog-2016.08.03不存在,则将直接返回:

{
    "error": "IndexMissingException[[ocslog-2016.08.03] missing]",
    "status": 404
}

这时,可以先调用下面这个api,检查索引是否存在

GET /ocslog-2016.08.03,ocslog-2016.08.04,ocslog-2016.08.05,ocslog-2016.08.06/_alias

返回:

{
    "ocslog-2016.08.05": {
        "aliases": {}
    },
    "ocslog-2016.08.06": {
        "aliases": {}
    },
    "ocslog-2016.08.04": {
        "aliases": {}
    }
}

说明:存在三个索引

再次执行:

GET /ocslog-2016.08.04,ocslog-2016.08.05,ocslog-2016.08.06/_search

如果,这三个索引中 ocslog-2016.08.04 索引是close状态的,将返回:
{
“error”: “IndexClosedException[[ocslog-2016.08.04] closed]”,
“status”: 403
}

这时,可以再调用下面的api,检查索引的状态

GET /_cat/indices/ocslog-2016.08.04,ocslog-2016.08.05,cdr-2015-02-26?v

返回:

health status index             pri rep docs.count docs.deleted store.size pri.store.size 
green  open   ocslog-2016.08.05   1   1          2            0     17.2kb          8.6kb 
green  open   ocslog-2016.08.06   1   1         13            0     25.3kb         12.6kb 
       close  ocslog-2016.08.04                                                              

分析下这个返回结果,可以过滤掉 close 的索引

最后得到二个可以正确 _search 的索引:

GET /ocslog-2016.08.05,ocslog-2016.08.06/_search

正常查询出结果

其实 kibana 的查询就是这样处理的,不过kibana没有过滤 close 的索引,如果查询索引中有 close 状态的索引,将返回失败,查询不到任何结果

### 使用 Elasticsearch Java API Client 实现批量索引操作 以下是使用 Elasticsearch Java API Client 进行批量索引操作的详细说明和示例代码。批量索引操作可以通过 `bulk` 方法实现,该方法允许一次性提交多个文档以提高性能。 #### 批量索引操作的核心概念 批量索引操作通过 `BulkRequest` 构建请求,并将多个文档添加到请求中[^1]。完成请求构建后,调用 `bulk` 方法执行批量操作。返回的 `BulkResponse` 包含所有操作的结果,可通过检查 `hasFailures()` 方法判断是否有失败项[^2]。 #### 示例代码:批量索引操作 以下代码展示了如何使用 Elasticsearch Java API Client 执行批量索引操作: ```java import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch.core.BulkRequest; import co.elastic.clients.elasticsearch.core.BulkResponse; import co.elastic.clients.elasticsearch.core.bulk.BulkOperation; import co.elastic.clients.elasticsearch.core.bulk.IndexOperation; import co.elastic.clients.json.JsonData; import co.elastic.clients.transport.rest_client.RestClientTransport; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import java.util.Map; public class BulkIndexExample { public static void main(String[] args) throws Exception { // 创建 RestClient RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200) ).build(); // 初始化 Elasticsearch 客户端 ElasticsearchClient client = new ElasticsearchClient( new RestClientTransport(restClient, JsonData.jackson()) ); // 构建 BulkRequest BulkRequest.Builder bulkRequest = new BulkRequest.Builder(); // 添加多个文档到 BulkRequest bulkRequest.operations(op -> op .add(IndexOperation.of(i -> i .index("my-index") .id("1") .document(Map.of("field1", "value1")))) .add(IndexOperation.of(i -> i .index("my-index") .id("2") .document(Map.of("field1", "value2")))) .add(IndexOperation.of(i -> i .index("my-index") .id("3") .document(Map.of("field1", "value3")))) ); // 执行批量索引操作 BulkResponse bulkResponse = client.bulk(bulkRequest.build()); // 检查是否有失败项 if (bulkResponse.hasFailures()) { System.out.println("Bulk operation has failures: " + bulkResponse.errors()); } else { System.out.println("All documents indexed successfully."); } // 关闭客户端 restClient.close(); } } ``` #### 批量索引操作的关键点 - **批量大小优化**:可以通过设置合理的批量大小(如每次处理 1000 条记录)来优化性能[^2]。 - **错误处理**:在执行批量操作后,务必检查 `BulkResponse` 的 `hasFailures()` 方法以确保所有操作成功。 - **资源管理**:在操作完成后,关闭 `RestClient` 以释放资源。 #### 性能优化建议 为了进一步提升批量索引操作的性能,可以考虑以下策略: - 设置合适的 `bulkSize` 和 `flushInterval` 参数[^2]。 - 确保 Elasticsearch 集群有足够的资源(如内存、CPU)以支持高并发写入操作。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值