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

Spring Data Elasticsearch查询时如何移除URL中的类型路径?

解决Spring Data Elasticsearch 2.2.13请求路径带Type的问题

针对你使用spring-boot-starter-data-elasticsearch 2.2.13.RELEASE对接Elasticsearch 6.7.2时,调用findAll()请求路径带Type(doc或类名),但权限仅允许访问索引_search接口的问题,提供以下几种解决方案:

方案一:直接设置@Document的type为空字符串

修改实体类的@Document注解,将type设为空字符串:

@Document(indexName = "funds_v1", createIndex = false, type = "")
@Getter
@Setter
public class Funds {

    @Id
    private String id;
    private String issuerId;
    private String strategyShortName;
}

此配置会让Spring Data Elasticsearch生成不带Type的请求路径/funds_v1/_search,直接符合权限要求。若部分旧版本存在兼容性问题,可尝试以下方案。

方案二:自定义Repository方法,手动构建无Type查询

通过自定义Repository方法,使用NativeSearchQuery直接指定索引、不指定Type,实现无Type的查询:

  1. 定义基础Repository接口:
public interface FundsRepository extends ElasticsearchRepository<Funds, String>, FundsCustomRepository {
}
  1. 定义自定义查询接口:
public interface FundsCustomRepository {
    Iterable<Funds> findAllWithoutType();
}
  1. 实现自定义查询逻辑:
@Component
public class FundsCustomRepositoryImpl implements FundsCustomRepository {

    private final ElasticsearchTemplate elasticsearchTemplate;

    public FundsCustomRepositoryImpl(ElasticsearchTemplate elasticsearchTemplate) {
        this.elasticsearchTemplate = elasticsearchTemplate;
    }

    @Override
    public Iterable<Funds> findAllWithoutType() {
        NativeSearchQuery query = new NativeSearchQueryBuilder()
                .withIndices("funds_v1")
                // 不调用withTypes(),避免生成Type路径
                .build();
        return elasticsearchTemplate.queryForList(query, Funds.class);
    }
}

之后直接调用findAllWithoutType()方法即可发起不带Type的请求。

方案三:全局重写ElasticsearchTemplate的Type获取逻辑

若希望所有Repository方法都默认不带Type路径,可以自定义ElasticsearchTemplate子类,重写Type获取逻辑:

@Component
public class CustomElasticsearchTemplate extends ElasticsearchTemplate {

    public CustomElasticsearchTemplate(Client client, ElasticsearchConverter converter) {
        super(client, converter);
    }

    @Override
    protected <T> String getTypeName(Class<T> clazz) {
        // 返回空字符串,全局移除Type路径
        return "";
    }
}

此配置会让所有基于ElasticsearchTemplate的查询(包括默认的findAll())都生成不带Type的请求路径,一次性解决所有接口的问题。

内容的提问来源于stack exchange,提问作者Matheus Yudi Matsubara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:35:27