我在我的项目中使用 Spring Data Solr。在某些情况下,生成的 Solr 查询太大(例如 15Kb+)并导致 Solr 异常。此解决方案:http ://codingtricks.fidibuy.com/participant/join/54fce329b760506d5d9e7db3/Spring-Data-Solr-cannot-handle-long-queries 对于某些查询仍然失败。由于通过 POST 直接将这些查询发送到 Solr 工作正常,我选择朝这个方向工作。我在 Spring Data Solr 中找不到任何配置查询的首选方法(GET/POST)的方法。因此,我得出了以下解决方案:我扩展了 SolrServer
public class CustomSolrServer extends HttpSolrServer {
public CustomSolrServer(String home, String core) {
super(home);
setCore(core);
}
@Override
public QueryResponse query(SolrParams params) throws SolrServerException {
METHOD method = METHOD.GET;
if (isBigQuery(params)) {
method = METHOD.POST;
}
return new QueryRequest( params, method ).process( this );
}
}
(跳过了一些细节,setCore() 和 isBigQuery() 是微不足道的,也被跳过了)并将其用作 SolrConfiguration.class 中的 SolrServer bean:
@Configuration
@EnableSolrRepositories(basePackages = { "com.vvy.repository.solr" }, multicoreSupport=false)
@Import(value = SolrAutoConfiguration.class)
@EnableConfigurationProperties(SolrProperties.class)
public class SolrConfiguration {
@Autowired
private SolrProperties solrProperties;
@Value("${spring.data.solr.core}")
private String solrCore;
@Bean
public SolrServer solrServer() {
return new CustomSolrServer(solrProperties.getHost(),solrCore) ;
}
}
这工作正常,但有几个缺点:我必须将 multiCoreSupport 设置为 false。这样做是因为当 Spring Data Solr 从接口实现存储库时,它上面的 multiCoreSupport 使用 MultiCoreSolrServerFactory 并尝试为每个核心存储一个服务器,这是通过将它们克隆到持有地图来完成的。自然,它在定制的 SolrServer 上崩溃,因为 SolrServerUtils 不知道如何 clone() 它。此外,我必须手动设置核心,而不是享受 Spring Data 从实体类上的@SolrDocument 注释参数中提取它。
以下是问题 1)主要和一般问题:是否有任何合理的方法来解决 Spring Data Solr 中查询过长的问题(或者更具体地说,使用 POST 而不是 GET)?2)一个小问题:有没有一种合理的方法可以在 Spring Data Solr 中自定义 SolrServer 并维护 multiCoreSupport?