Elasticsearch Java API Client如何排除以点开头的索引?
问题解决:Elasticsearch Java API Client 排除以点开头的索引
版本信息
- Elk-Stack Version: 8.7.1
- Java Api Client: 8.13.1
你需要在执行搜索时遍历所有索引,但排除所有以点(.)开头的索引。常规Elasticsearch API中可通过*,-.*的索引模式实现,但使用Java API Client的withJson功能时,只能通过index()方法指定索引,之前尝试传入"*", "-.*"未成功。
正确传递索引模式参数
Java API Client的index()方法支持传入多个索引模式字符串,你需要将包含模式和排除模式作为独立参数传入,而非合并成一个字符串。修改后的代码如下:
Reader queryJson = new StringReader("{\n" + " \"_source\": {\n" + " \"excludes\": [ \"@timestamp\", \"@version\" ]\n" + " },\n" + " \"size\": 500,\n" + " \"query\": {\n" + " \"multi_match\": {\n" + " \"query\": \"Beratung\",\n" + " \"fields\": [\"*\"]\n" + " }\n" + " }\n" + "}"); // 将*(匹配所有索引)和-.*(排除以点开头的索引)作为独立参数传入index方法 SearchRequest request = SearchRequest.of(b -> b .withJson(queryJson) .index("*", "-.*") ); SearchResponse<Object> response = esClient.search(request, Object.class);
原理说明
Elasticsearch的索引模式规则中:
*匹配所有索引- 前缀
-表示排除该模式匹配的索引
Java API Client会将多个索引模式参数组合成符合Elasticsearch要求的索引路径,从而实现只搜索非点开头的索引。
备选方案(不推荐)
如果上述方法因版本兼容问题无法生效,可在查询语句中添加对_index字段的过滤,通过正则表达式排除以点开头的索引。这种方式是在查询结果层面过滤,效率低于索引模式方式:
修改后的JSON查询内容:
{ "_source": { "excludes": [ "@timestamp", "@version" ] }, "size": 500, "query": { "bool": { "must": [ { "multi_match": { "query": "Beratung", "fields": ["*"] } } ], "must_not": [ { "regexp": { "_index": "^\\..*" } } ] } } }
内容的提问来源于stack exchange,提问作者Oliver Olbrueck
相关产品推荐
相关产品推荐

