使用多核配置 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());
}
}
我在将我的 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());
}
}