我有多个内核的apache solr,例如货币,国家等...所以使用Spring Data Solr我可以从一个核心检索信息。我现在正在对'currency'核心进行此XML配置查询。如果我想查询'country'核心,我该怎么设置它?
<!-- Enable Solr repositories and configure repository base package -->
<solr:repositories base-package="com.acme.repository" solr-template-ref="solrCurrencyTemplate"/>
<solr:solr-server id="solrCurrencyServer" url="http://localhost:8983/solr/currency"/>
<bean id="solrCurrencyTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg ref="solrCurrencyServer" />
</bean>
并将存储库定义为
@Repository
public interface CurrencyRepository extends SolrCrudRepository<Currency, String> {
}
从我的服务我可以做到这一点
@Override
public List<Currency> getCurrencies() {
Page<Currency> currencies = (Page<Currency>) currencyRepository.findAll();
return currencies.getContent();
}
我也尝试过使用 @SolrDocument(solrCoreName =“currency”),但这不行。
@SolrDocument(solrCoreName = "currency")
public class Currency {
public static final String FIELD_CURRENCY_NAME = "currency_name";
public static final String FIELD_CURRENCY_CODE = "currency_code";
public static final String FIELD_DECIMALS = "decimals";
@Id
@Field(value = FIELD_CURRENCY_CODE)
private String currencyCode;
//currency_name,decimals
@Field(value = FIELD_CURRENCY_NAME)
private String currencyName;
@Field(value = FIELD_DECIMALS)
private String decimals;
...
...
...
}
我需要这方面的帮助......否则我将不得不回到RestTemplate解决方案: - (
希望有人可以提供帮助。 谢谢 GM
答案 0 :(得分:9)
以为我会分享,我们最近花了很多时间配置多个核心。我们在java中做过,而不是xml。
作为spring @configuration的一部分添加以下内容。
@Bean(name="solrCore1Template")
public SolrTemplate solrCore1Template() throws Exception {
EmbeddedSolrServer embeddedSolrServer = new EmbeddedSolrServer(getCoreContainer(), "core1");
return new SolrTemplate(embeddedSolrServer);
}
@Bean(name="solrCore2Template")
public SolrTemplate solrCore2Template() throws Exception {
EmbeddedSolrServer embeddedSolrServer = new EmbeddedSolrServer(getCoreContainer(), "core2");
return new SolrTemplate(embeddedSolrServer);
}
@Bean
@Scope
public CoreContainer getCoreContainer() throws FileNotFoundException{
String dir = <path_to_solr_home>;
System.setProperty("solr.solr.home", dir);
CoreContainer.Initializer initializer = new CoreContainer.Initializer();
return initializer.initialize();
}
并在服务类中使用如下所示的每个模板。
@Resource
private SolrTemplate solrCore1Template;
使用以下代码可以使用HTTP关联嵌入式服务器。
HttpSolrServer httpSolrServer = new HttpSolrServer(getSolrURL());
return new SolrTemplate(httpSolrServer, "core1");
希望这会有所帮助。我知道对于提出的问题,这是一个非常晚的回复。
答案 1 :(得分:4)
@Autowired
@Qualifier("solrCurrencyTemplate")
private SolrTemplate solrCurrencyTemplate;
@Autowired
@Qualifier("solrCountryTemplate")
private SolrTemplate solrCountryTemplate;
//...
CurrencyRepository currencyRepo = new SolrRepositoryFactory(this.solrCurrencyTemplate)
.getRepository(CurrencyRepository.class);
CountryRepository countryRepo = new SolrRepositoryFactory(this.solrCountryTemplate)
.getRepository(CountryRepository.class);
答案 2 :(得分:1)
使用Spring Data Solr 1.1.0.RC1多个内核的工作原理如Christoph Strobl所描述@EnableSolrRepositories
。它也可以通过set multicore-support="true"
。
<solr:repositories base-package="your.solr.repo.package" repository-impl-postfix="Impl" multicore-support="true"/>
<solr:solr-server id="solrServer" url="${solr.server.base.connection.url}" />
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg index="0" ref="solrServer" />
</bean>
答案 3 :(得分:1)
<solr:solr-server id="solrServer" timeout="1000" maxConnections="1000" url="${solr.server.1},${solr.server.2}"/>
<bean id="solrServerFactory" class="org.springframework.data.solr.server.support.MulticoreSolrServerFactory">
<constructor-arg ref="solrServer" />
<constructor-arg name="cores">
<list>
<value>${solr.index.customer}</value>
<value>${solr.index.task}</value>
</list>
</constructor-arg>
</bean>
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg ref="solrServerFactory" />
</bean>
<solr:repositories base-package="com.deve.pig.solr" multicore-support="true" solr-template-ref="solrTemplate" />
答案 4 :(得分:1)
Spring Data现在支持多个核心及其各自的存储库。
在@EnableJpaRepository
注释中,multicoreSupport标志必须为true,并且需要告知相应的文档它们属于哪个核心。像:
@SolrDocument(solrCoreName = "currency")
public class Currency
{
// attributes
}
另一个班应该是
@SolrDocument(solrCoreName = "country")
public class Country
{
// attributes
}
各个存储库应该知道他们正在使用的pojo。
public interface CurrencyRepository extends SolrCrudRepository<Currency,String>
{
}
和
public interface CountryRepository extends SolrCrudRepository<Country,String>
{
}
并且配置应该是
@Configuration
@EnableSolrRepositories(value = "com.package.name",multicoreSupport = true)
public class SolrConfig
{
@Bean
public SolrServer solrServer() throws Exception
{
HttpSolrServerFactoryBean f = new HttpSolrServerFactoryBean();
f.setUrl("http://localhost:8983/solr");
f.afterPropertiesSet();
return f.getSolrServer();
}
@Bean
public SolrTemplate solrTemplate(SolrServer solrServer) throws Exception
{
return new SolrTemplate(solrServer());
}
}