2

我在我的项目中使用 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?

4

1 回答 1

1

Q1 的答案:是的,您可以使用 POST 而不是 GET。

Q2 的答案:是的,你已经做了一半。除了以下内容:

1)你必须将'CustomSolrServer'重命名为'HttpSolrServer',你可以检查方法

org.springframework.data.solr.server.support.SolrServerUtils#clone(T, java.lang.String)

原因。

2)你不必指定具体的核心名称。你可以使用注释指定核心名称

org.springframework.data.solr.core.mapping.SolrDocument

在相应的 solr 模型上。

3)设置多核支持=真

根据您的类样本,它们应如下所示:

package com.x.x.config;

import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.params.SolrParams;

public class HttpSolrServer extends org.apache.solr.client.solrj.impl.HttpSolrServer {

    public HttpSolrServer(String host) {
        super(host);
    }

    @Override
    public QueryResponse query(SolrParams params) throws SolrServerException {
        SolrRequest.METHOD method = SolrRequest.METHOD.POST;
        return new QueryRequest(params, method).process(this);
    }
}


@Configuration
@EnableSolrRepositories(basePackages = { "com.vvy.repository.solr" }, multicoreSupport=true)
@Import(value = SolrAutoConfiguration.class)
@EnableConfigurationProperties(SolrProperties.class)

public class SolrConfiguration {

    @Autowired
    private SolrProperties solrProperties;

    @Bean
    public SolrServer solrServer() {
        return new com.x.x.config.HttpSolrServer(solrProperties.getHost()) ;
    }   
}

ps:最新的spring-data-solr 3.xx 已经支持自定义查询请求方式,见post issue

于 2017-02-21T11:44:57.450 回答