使用多核配置 Spring Data Solr

Configure Spring Data Solr with multiple cores

我在将我的 solr 配置从 1.5.4 升级到 3.0.0.M4 时遇到问题(连同 Spring 启动更新到 2.0.0.M2)。

之前的配置文件(spring-data-solr 1.5.4.RELEASE):

@Configuration
@EnableSolrRepositories(value = "com.bar.foo.repository.solr", multicoreSupport = true)
public class SolrConfiguration implements EnvironmentAware{

    private RelaxedPropertyResolver propertyResolver;
    private Environment             environment;

    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
        this.propertyResolver = new RelaxedPropertyResolver(environment, "spring.data.solr.");
    }

    @Bean
    public SolrServer solrServer() {
        String solrHost = propertyResolver.getProperty("host");
        return new HttpSolrServer(solrHost);
    }


    @Bean(name = "core1SolrTemplate")
    public SolrOperations core1SolrTemplate() {
        HttpSolrServer httpSolrServer = new HttpSolrServer(propertyResolver.getProperty("host"));
        return new SolrTemplate(httpSolrServer, "Core1");
    }

    @Bean(name = "core2SolrTemplate")
    public SolrOperations core2SolrTemplate() {
        HttpSolrServer httpSolrServer = new HttpSolrServer(propertyResolver.getProperty("host"));
        return new SolrTemplate(httpSolrServer, "Core2");
    }
    ...
}

然后我们在代码中使用这些 solrtemplate 作为

@Resource SolrTemplate core1SolrTemplate;
@Resource SolrTemplate core2SolrTemplate;

尝试更新时,我发现 HttpSolrServer 不再可用,我们应该使用 SolrClient,但是随着 multicoreSupport 的移除和声明模板核心的能力,我不知道如何为每个核心分配一个模板(或者一个能够检测到查询哪个核心的?)

这是我当前的非工作配置:

@Configuration
@EnableSolrRepositories(value = "com.bar.foo.repository.solr")
public class SolrConfiguration {

    @Inject
    private Environment             environment;

    @Bean
    public SolrClient solrClient() {
        return new HttpSolrClient.Builder(environment.getProperty("spring.data.solr.host")).build();
    }

    @Bean
    public SolrTemplate solrTemplate() {
        return new SolrTemplate(solrClient());
    }

}

我们的 Pojos 配置为:

@SolrDocument(solrCoreName = "Core1")
public class Foo{
    @Id
    private String                     id;

    ...
}

调用抛出错误

core1SolrTemplate.queryForPage(simpleQuery, Foo.class)

"Caused by: org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException: Error from server at http://192.168.99.100:8983/solr: Expected mime type application/octet-stream but got text/html. "

看起来 solrtemplate 只调用了 baseurl 而没有选择任何核心。

我也尝试像以前一样创建多个 SolrTemplate 并将参数传递给 solrClient() 以构建每个核心的特定 url 但未能成功(我有错误,其中第二个模板显然是使用第一个 solrtemplate bean,指向错误的核心)。

我应该如何配置 Solr 才能查询多核?

当前 (2.1.4) solr 文档: http://docs.spring.io/spring-data/data-solr/docs/current/reference/html/#solr.multicore

3.0.0.M4 文档中未描述多核: http://docs.spring.io/spring-data/data-solr/docs/3.0.0.M4/reference/html/#solr.multicore

我认为您需要将 @SolrDocument 注释添加到您的 pojos 才能使用多核支持。请参阅下面的问题进行讨论。不过,取决于您的设置方式。

Spring Data Solr multiple cores and repository

看来我累了,下面的配置似乎工作正常 - 欢迎随时改进它

@Configuration
@EnableSolrRepositories(basePackages={"com.example.demo.repository"})
public class SolrContext {

    static final String SOLR_HOST = "solr.host";

    @Autowired
    private Environment environment;

    @Bean
    public SolrClient solrClient() {
        return new HttpSolrClient.Builder(environment.getProperty(SOLR_HOST)).build();
    }

    @Bean
    public SolrTemplate solrTemplate() {
        return new SolrTemplate(solrClient());
    }

    @Bean
    public SolrTemplate core1Template() {
        return new SolrTemplate(new HttpSolrClient.Builder(environment.getProperty(SOLR_HOST)+"/core1").build());
    }

    @Bean
    public SolrTemplate core2Template() {
        return new SolrTemplate(new HttpSolrClient.Builder(environment.getProperty(SOLR_HOST)+"/core2").build());
    }
}

附例: https://github.com/Farael49/spring-solr-config/blob/master/demo/src/main/java/com/example/demo/web/CoreController.java