You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:42:45