配置具有多个核心的

时间:2017-07-21 16:55:30

标签: spring spring-boot spring-data-solr

我遇到了将我的solr配置从1.5.4升级到3.0.0.M4(以及Spring Boot更新到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)

“引起:org.apache.solr.client.solrj.impl.HttpSolrClient $ RemoteSolrException:来自http://192.168.99.100:8983/solr的服务器的错误:预期的mime类型application / octet-stream但是得到了text / html。”

看起来solrtemplate只是在没有选择任何核心的情况下调用baseurl。

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

如何配置Solr以查询多个内核?

Current(2.1.4)solr doc: 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

2 个答案:

答案 0 :(得分:0)

我认为您需要将@SolrDocument注释添加到您的pojos以使用多核支持。请参阅下面的问题进行讨论取决于你如何设置它。

Spring Data Solr multiple cores and repository

答案 1 :(得分:0)

看起来我累了,以下配置似乎工作正常 - 随时随地改进

@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