복붙노트

[SPRING] 여러 코어 및 저장소에 Spring Data Solr을 사용하여 사용자 정의 Solr 저장소를 구현하는 방법

SPRING

여러 코어 및 저장소에 Spring Data Solr을 사용하여 사용자 정의 Solr 저장소를 구현하는 방법

나는 spring-data-solr을 사용하여 하나의 서비스에서 multiple / 2 repos에 접근 할 수 있기를 원한다. 스프링 데이터 솔라 (Spring Data Solr)의 여러 코어와 저장소에서 네임 스페이스 설정을 통한 멀티 코어 지원은 안타깝게도 아직 공개되지 않은 문제입니다.

다음 예제를 통해 나를 도울 수 있습니까? 어떻게 사용자 정의 Repos를 만들 수 있습니까?

내 applicationContext.xml에는 아래에 정의 된 두 개의 Solr 템플릿이 있습니다.

<!-- Enable Solr repositories and configure repository base package -->
<solr:repositories base-package="com.ay.api.repository"/>

<!-- Configures HTTP Solr server -->
<solr:solr-server id="solrServer" url="${solr.server.url}"/>

<!-- Configures Solr Events template -->
   <bean id="solrEventsTemplate" class="org.springframework.data.solr.core.SolrTemplate">
   <qualifier type="solrEventsTemplate"/>
   <constructor-arg index="0" ref="solrServer"/>
   <constructor-arg index="1" value="${solr.server.events.core.name}"/>
</bean>

<!-- Configures Solr Towns template -->
<bean id="solrTownsTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg index="0" ref="solrServer"/>
<constructor-arg index="1" value="${solr.server.towns.core.name}"/>
</bean>

나는 다음과 같은 repos를 가지고있다.

@Repository
public class EventDocumentRepositoryImpl implements EventSearchRepository { 


@Resource
@Qualifier("solrEventsTemplate")
private SolrTemplate solrEventsTemplate;

...
}

public interface EventDocumentRepository extends EventSearchRepository, SolrCrudRepository<EventDocument, String> {

}

public interface EventSearchRepository { .... }


@Repository
public class TownRepositoryImpl implements TownSearchRepository { ... 

@Resource
@Qualifier("solrTownsTemplate")
private SolrTemplate solrTownsTemplate;

...
}

public interface TownRepository extends SolrCrudRepository<TownDocument, String>{}
public interface TownSearchRepository { .... }

마지막으로 Service는 다음과 같습니다.

 @Service
 public class SearchEventServiceImpl implements SearchEventService {

 @Resource
 private EventDocumentRepository eventRepository;

 @Resource
 private TownRepository townRepository;
 .....
 }

스프링 데이터 솔라에서 Solr 4.1 멀티 코어를 사용하여 언급 한대로 사용자 정의 리포지토리 구현 코드를 어떻게 수정할 수 있습니까? 나는이 스레드에서 제안 된 해결책을 이해할 수 없기 때문에.

사전에 많은 감사드립니다.

해결법

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

    1.저장소 검색은 solrTemplate을 찾고 제공된 템플리트를 사용하여 저장소를 작성합니다. 각 Solr 코어마다 하나의 템플릿이 필요하므로 템플릿과 저장소를 수동으로 만들어야합니다.

    저장소 검색은 solrTemplate을 찾고 제공된 템플리트를 사용하여 저장소를 작성합니다. 각 Solr 코어마다 하나의 템플릿이 필요하므로 템플릿과 저장소를 수동으로 만들어야합니다.

    먼저 리포지토리와 사용자 지정 구현을 만듭니다.

    public interface EventRepositoryCustom {
    
        Page<Event> findEvent();
    
    }
    
    public interface EventRepository extends EventRepositoryCustom, SolrCrudRepository<Event, String> {
    
    }
    
    public class EventRepositoryImpl implements EventRepositoryCustom {
    
        private SolrTemplate eventTemplate;
    
        public EventRepositoryImpl(SolrTemplate eventTemplate) {
            this.eventTemplate = eventTemplate;
        }
    
        @Override
        public Page<Event> findEvent() {
            return eventTemplate.queryForPage(new SimpleQuery("*:*"), Event.class);
        }
    
    }
    

    TownRepository에도 똑같이하십시오.

    구성을 위해 Java Config 사용. 동일한 작업을 XML로 수행 할 수 있습니다.

    @Configuration
    public class SolrContext {
    
      private static final String PROPERTY_NAME_SOLR_SERVER_URL = "solr.host";
    
      @Resource
      private Environment environment;
    
      // Factory creates SolrServer instances for base url when requesting server
      // for specific core. 
      @Bean
      public SolrServerFactory solrServerFactory() {
        return new MulticoreSolrServerFactory(new HttpSolrServer(
                environment.getRequiredProperty(PROPERTY_NAME_SOLR_SERVER_URL)));
      }
    
      // SolrTemplate for /solrServerUrl/towns
      @Bean
      public SolrTemplate townTemplate() throws Exception {
        SolrTemplate solrTemplate = new SolrTemplate(solrServerFactory());
        solrTemplate.setSolrCore("towns");
        return solrTemplate;
      }
    
      // SolrTemplate for /solrServerUrl/events
      @Bean
      public SolrTemplate eventTemplate() throws Exception {
        SolrTemplate solrTemplate = new SolrTemplate(solrServerFactory());
        solrTemplate.setSolrCore("events");
        return solrTemplate;
      }
    
      @Bean
      public EventRepository eventRepository() throws Exception {
        return new SolrRepositoryFactory(eventTemplate())
          .getRepository(EventRepository.class, new EventRepositoryImpl(eventTemplate()));
      }
    
      @Bean
      public TownRepository townRepository() throws Exception {
        return new SolrRepositoryFactory(townTemplate())
          .getRepository(TownRepository.class, new TownRepositoryImpl(townTemplate()));
      }
    }
    
  2. ==============================

    2.내가 대답을 제안 할 때 PersistenceExceptionTranslator 예외가 발생하여이 bean을 수동으로 초기화합니다.

    내가 대답을 제안 할 때 PersistenceExceptionTranslator 예외가 발생하여이 bean을 수동으로 초기화합니다.

    <beans:bean id="PersistenceExceptionTranslator" class="org.springframework.data.solr.core.SolrExceptionTranslator"/>
    
  3. from https://stackoverflow.com/questions/20872393/how-to-implement-custom-solr-repository-using-spring-data-solr-for-multiple-core by cc-by-sa and MIT license