不同业务数据放在不同索引中,如果查询结果混入其他数据,先检查“查哪里”,再检查“查什么”。
在 SearchRequest 中指定索引
ES 7.3 的 Java High Level REST Client 可以在构造请求时传入索引名:
SearchRequest request = new SearchRequest("example_articles");
SearchSourceBuilder source = new SearchSourceBuilder()
.query(QueryBuilders.matchAllQuery())
.size(10);
request.source(source);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
这里假设 client 已按项目配置初始化,相关类来自匹配版本的 Elasticsearch Java REST 客户端。代码演示查询入口,不包含认证和完整异常处理。ES 7.3 Search API
该版本无参 SearchRequest 的默认目标与传入一个索引不同。SQL 式过滤条件或某个字段值,也不会自动替你把请求限定到对应索引。
对照实际请求路径
上面的目标大致对应 REST 入口:
GET /example_articles/_search
{
"query": { "match_all": {} },
"size": 10
}
排查时保存最终路径、索引参数与响应中的 _index。若使用别名、多索引或通配名称,还应检查最终展开的目标,不要只看应用变量里写了一个字符串。
限定索引不是权限隔离
构造请求时选择索引,只是应用行为;服务器仍需用权限控制允许访问的范围。如果索引名来自外部输入,应映射到明确的允许列表,而不是让调用方任意指定。
这条记录源于 2019 年的 ES 7.x 工程。新客户端的类型与构造方式可能不同,应按对应版本 API 使用;核心原则不变:请求目标、查询条件和授权边界分别确认。