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的查询:
- 定义基础Repository接口:
public interface FundsRepository extends ElasticsearchRepository<Funds, String>, FundsCustomRepository { }
- 定义自定义查询接口:
public interface FundsCustomRepository { Iterable<Funds> findAllWithoutType(); }
- 实现自定义查询逻辑:
@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
相关产品推荐
相关产品推荐

