spring spring-data spring-data-solr

Spring Data Solr múltiples núcleos y repositorio



spring-data spring-data-solr (5)

Tengo apache solr con múltiples núcleos, por ejemplo, moneda, país, etc. ... Así que con Spring Data Solr puedo recuperar información de un núcleo. Tengo esta configuración XML en este momento consultas contra core ''currency'' . Si quería consultar el núcleo de ''país'', ¿cómo puedo configurarlo?

<!-- 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>

y tener el repositorio definido como

@Repository public interface CurrencyRepository extends SolrCrudRepository<Currency, String> { }

y de mi servicio puedo hacer esto

@Override public List<Currency> getCurrencies() { Page<Currency> currencies = (Page<Currency>) currencyRepository.findAll(); return currencies.getContent(); }

También intenté usar @SolrDocument (solrCoreName = "currency") pero esto no funcionó.

@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; ... ... ... }

Necesito ayuda en esto lo antes posible ... de lo contrario tendré que volver a la Solución RestTemplate :-(

Espero que alguien pueda ayudar. Gracias GM


El soporte multinúcleo a través de la configuración del espacio de nombres desafortunadamente es un problema abierto. Tendrá que tener SolrTemplate por separado para cada núcleo y crear repositorios manualmente.

@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);


Con Spring Data Solr 1.1.0.RC1, varios núcleos funcionan como los describe Christoph Strobl con @EnableSolrRepositories . Funciona también con una configuración XML mediante 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>


Pensé que compartiría: pasamos mucho tiempo configurando múltiples núcleos recientemente. Lo hicimos en Java, no en xml.

Como parte de spring @configuration, agregue los siguientes.

@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(); }

Y para usar cada plantilla, utiliza como se detalla a continuación en las clases de servicio.

@Resource private SolrTemplate solrCore1Template;

El servidor integrado se puede relacionar con HTTP usando el código siguiente.

HttpSolrServer httpSolrServer = new HttpSolrServer(getSolrURL()); return new SolrTemplate(httpSolrServer, "core1");

Espero que esto ayude. Sé que es una respuesta muy tardía para la pregunta hecha.


<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" />


Spring Data ahora admite múltiples núcleos con sus respectivos repositorios.

El indicador multicoreSupport debe ser verdadero en la anotación @EnableJpaRepository y se debe indicar al documento correspondiente a qué núcleo pertenecen. Me gusta:

@SolrDocument(solrCoreName = "currency") public class Currency { // attributes }

la otra clase debe ser

@SolrDocument(solrCoreName = "country") public class Country { // attributes }

Los repositorios respectivos deberían saber con qué pojo están trabajando.

public interface CurrencyRepository extends SolrCrudRepository<Currency,String> { }

y

public interface CountryRepository extends SolrCrudRepository<Country,String> { }

y la configuración debe ser

@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()); } }