solr4.2 플러그인 체인을 사용하여 증량 index 논리를 보완하고 간소화

7460 단어 solr
업무 배경
이전에 촌뜨기를 할 때 플러그인을 개발한 적이 있다. 즉, 동태적으로 상품의 유형에 따라 이 상품이 조화롭게 해야 하는지 아닌지를 판정하기 때문에 업데이트 상품 정보를 알 때 상품은 반드시 약간의 Processor로 구성된 chain을 거쳐 최종적으로 베이스 색인에 들어갈 것이다.
현재 직면하고 있는 문제는 이렇다. 현재의 상품 논리는 비교적 복잡하다.db에서 얻지 못한 필드가 많은데 색인에 들어갈 때 업무 논리에 따라 상응하는 처리를 한다. 예를 들어 시간 간격,title, 그리고 오프라인의 일부 점수, 예를 들어 상품 예측 품질 점수 등이다.전량 인덱스 시 논리는 완전히 제어할 수 있지만 증량 인덱스는 기본적으로 작은 백 버전의 업데이트 방식을 사용하면 백엔드의 웹 쪽 논리가 검색엔진과 관련된 논리를 너무 많이 탑재하고 무겁다. 또한 매번 업무 논리가 바뀐 후에 같은 논리인 자바 쪽을 한 부 쓰고 웹 쪽을 한 부 쓰고 코드 리뷰를 써야 한다. 의외의 일이 발생하지 않으면 자주 오류가 발생한다.그래서 통정사통은 Solr의 업데이트 플러그인을 개발하여 근본적으로 증가하는 문제를 해결하고 웹단 동지를 구출하기로 결정했다.
Update Request ProcessorChain 기본 chain은
  • LogUpdateProcessorFactory
  • DistributedUpdateProcessorFactory
  • RunUpdateProcessorFactory

  • 구성된, Solr 공식 문서에 따르면 Distributed Update Processor Factory는 기본적으로 RunUpdate Processor Factory 앞에 나타나는 것으로 Solrcloud의 기능을 지원하기 위한 것이다.
    Begining with Solr4.0 all UpdateRequestProcessorChains which include RunUpdateProcessorFactory, but do not include an implementation of the DistributingUpdateProcessorFactory will have an instance of DistributedUpdateProcessorFactory automaticly injected immediately prior to the RunUpdateProcessorFactory.
    그래서 제 업무에 설정된 업데이트 Request Processor Chain이 표시하지 않은 Distributed Update Processor Factory도 실제 코드를 실행할 때 Distributed Update Processor Factory를 RunUpdate Processor Factory 앞에 놓고 mychain을 사용하여 문서를 업데이트할 때 4개의 Processor Factory가 있는 chain을 만들어 처리합니다.한편, 소프트웨어 Commit 등 관련 설정은 최종 업데이트Handler와만 관련이 있다. 즉, RunUpdate ProcessorFactory는 업데이트Handler를 호출하여commit 등 관련 작업을 하기 때문에 새로운 chain은소프트웨어 Commit 등 관련 설정에 영향을 주지 않는다.
    <updateRequestProcessorChain name="mychain" >  
       <processor class="com.niuniu.update.plugin.NiuniuProcessorFactory" />  
       <processor class="solr.LogUpdateProcessorFactory" />  
       <processor class="solr.RunUpdateProcessorFactory" />  
     updateRequestProcessorChain> 

    그럼 사용자 정의 업데이트 Request Processor Chain을 어떻게 설정하는지 Solr에 대해 알아보겠습니다.LogUpdate Processor Factory,Distributed Update Processor Factory 및solr.Update Processor Factory에 대응하는 기능이 무엇인지 알고 맞춤형 Processor Factory를 chain의 어느 부분에 두어야 하는지 알 수 있습니다.
  • LogUpdate ProcessorFactory는 로그를 치는 데 쓰인다
  • RunUpdate Processor Factory는 업데이트된 내용을 디스크에 영구화하는 데 사용됩니다
  • 그래서 우리의 업무와 관련된 Processor Factory는 chain의 맨 끝, 즉 공식 문서에서 말해야 한다.
    Configuring Individual Processors as Top-Level Plugins
    공식 맞춤형 ProcessorFactory 개발 설명서를 참조하십시오.
    package my.solr;
    
    import java.io.IOException;
    
    import org.apache.solr.common.SolrInputDocument;
    import org.apache.solr.request.SolrQueryRequest;
    import org.apache.solr.response.SolrQueryResponse;
    import org.apache.solr.update.AddUpdateCommand;
    import org.apache.solr.update.processor.UpdateRequestProcessor;
    import org.apache.solr.update.processor.UpdateRequestProcessorFactory;
    
    public class ConditionalCopyProcessorFactory extends UpdateRequestProcessorFactory
    {
      @Override
      public UpdateRequestProcessor getInstance(SolrQueryRequest req, SolrQueryResponse rsp, UpdateRequestProcessor next)
      {
        return new ConditionalCopyProcessor(next);
      }
    }
    class ConditionalCopyProcessor extends UpdateRequestProcessor
    {
      public ConditionalCopyProcessor( UpdateRequestProcessor next) {
        super( next );
      }
      @Override
      public void processAdd(AddUpdateCommand cmd) throws IOException {
        SolrInputDocument doc = cmd.getSolrInputDocument();
    
        Object v = doc.getFieldValue( "popularity" );
        if( v != null ) {
          int pop = Integer.parseInt( v.toString() );
          if( pop > 5 ) {
            doc.addField( "cat", "popular" );
          }
        }
    
        // pass it up the chain
        super.processAdd(cmd);
      }
    }  

    배치가 완료되면 추가 업데이트 (add or update) 를 할 때 업데이트를 지정할 수 있습니다.chain=mychain은 우리의 업무 수요를 만족시킬 수 있다
    curl "http://localhost:8983/solr/production/update?update.chain=mychain" -H "Content-Type: text/xml" --data-binary '
    <add>
    <doc>
        <field name="id">10field>
        <field name="brand_name">  field>
        <field name="car_model_name">  field>
        <field name="standard_name">  field>
        <field name="remark">    field>
      doc>
      add>'
    

    현재 중국어의 문서가 비교적 적다는 것을 특별히 기록합니다.
    참고 자료
    Solr Confluence Solr Wiki

    좋은 웹페이지 즐겨찾기