복붙노트

[SPRING] Spring 데이터 Solr 다중 코어 및 저장소

SPRING

Spring 데이터 Solr 다중 코어 및 저장소

내가 여러 코어와 아파치 solr 예. 통화, 국가 등등 ... 그래서 스프링 데이터 Solr을 사용하여 하나의 코어에서 정보를 검색 할 수 있습니다. 이 XML 설정은 현재 '통화'코어에 대해 쿼리하고 있습니다. 'country'core에 대해 쿼리하고 싶다면 어떻게 설정해야합니까?

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

나는 또한 @ SolderDocument (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 Solution으로 돌아 가야 할 것이다 :-(

누군가가 도울 수 있기를 바랍니다. 감사 GM

해결법

  1. ==============================

    1.공유 할 줄 ​​알았는데 최근에 여러 코어를 구성하는 데 많은 시간을 소비합니다. 우리는 java가 아니라 xml을 사용했습니다.

    공유 할 줄 ​​알았는데 최근에 여러 코어를 구성하는 데 많은 시간을 소비합니다. 우리는 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");
    

    희망이 도움이됩니다. 내가 물었던 질문에 대한 답변이 매우 늦었다.

  2. ==============================

    2.네임 스페이스 구성을 통한 멀티 코어 지원은 불행히도 미해결 문제입니다. 각 코어에 대해 별도의 SolrTemplate을 가지고 리포지토리를 수동으로 생성해야합니다.

    네임 스페이스 구성을 통한 멀티 코어 지원은 불행히도 미해결 문제입니다. 각 코어에 대해 별도의 SolrTemplate을 가지고 리포지토리를 수동으로 생성해야합니다.

    @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);
    
  3. ==============================

    3.Spring Data Solr 1.1.0.RC1을 사용하면 Christoph Strobl이 @EnableSolrRepositories를 사용하여 설명한 것처럼 여러 코어가 작동합니다. 또한 multicore-support = "true"로 설정하여 XML 구성에서도 작동합니다.

    Spring Data Solr 1.1.0.RC1을 사용하면 Christoph Strobl이 @EnableSolrRepositories를 사용하여 설명한 것처럼 여러 코어가 작동합니다. 또한 multicore-support = "true"로 설정하여 XML 구성에서도 작동합니다.

    <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>
    
  4. ==============================

    4.

    <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" />
    
  5. ==============================

    5.Spring Data는 이제 각각의 리포지토리를 통해 여러 코어를 지원합니다.

    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());
        }
    }
    
  6. from https://stackoverflow.com/questions/16859181/spring-data-solr-multiple-cores-and-repository by cc-by-sa and MIT license