2011-12-12 2 views
0

또 다른 잠재적으로 난처한 질문입니다. 간과되었을 수있는 명백한 솔루션을 지적하십시오. 이전에 솔루션을 검색했지만 아무 것도 발견하지 못했지만 때로는 검색 할 잘못된 키워드를 선택하는 문제가 있습니다.
몇 달 전에 enterprise-y 시스템에 대한 내 자신의 RequestHandler를 코딩하여 solr 코어에 대한 모든 쿼리에 추가 필터로 몇 가지 필요한 보안 매개 변수를 주입했습니다. 인덱스에 대한 쿼리로 인해 생성 된 문서가 수집되어 사용자에게 반환 될 때까지 모든 작업이 순조롭게 진행됩니다.Solr Custom RequestHandler - 결과 최적화

기본적으로 필터가 생성되고 쿼리가 실행 된 후 우리는 문서 ID (및 점수) 집합을 얻습니다.하지만 결과 집합을 빌드하기 위해 ID를 반복해야합니다. 이는 표준 요청 처리기를 쿼리하는 것보다 10 배 더 느리고 결과 수가 증가함에 따라 악화 될 수밖에 없습니다. 더 나쁜 것은 스키마가 유연성을 위해 동적 필드에 크게 의존하기 때문에 이전에 문서 당 가능한 모든 조합을 테스트하는 것 이외에는 문서 당 검색 할 필드 목록을 이전에 검색하는 방법이 없다는 것입니다.

아래 코드는 SolrIndexSearcher를 쿼리하고 응답을 작성하기 위해 프로덕션 환경에서 실행되는 간단한 버전입니다. 속히

, 내 질문은 :

  • 한 번에 모든 결과를 검색하는 대신 문서로 응답 문서를 구축하는 방법은 없나요?
  • 가능한 모든 조합을 테스트하는 대신 각 결과에 필드 목록을 가져올 가능성이 있습니까?
  • 이 코드에서 알고 있어야하는 특정 WTF는 무엇입니까? 기분이 자유 롭다!
//function that queries index and handles results 
private void searchCore(SolrIndexSearcher searcher, Query query, 
     Filter filter, int num, SolrDocumentList results) { 

    //Executes the query 
    TopDocs col = searcher.search(query,filter, num); 

    //results 
    ScoreDoc[] docs = col.scoreDocs;   

    //iterate & build documents 
    for (ScoreDoc hit : docs) { 
     Document doc = reader.document(hit.doc); 
     SolrDocument sdoc = new SolrDocument(); 

     for(Object f : doc.getFields()) { 
      Field fd = ((Field) f); 

      //strings 
      if (fd.isStored() && (fd.stringValue() != null)) 
       sdoc.addField(fd.name(), fd.stringValue()); 
      else if(fd.isStored()) { 
       //Dynamic Longs 
       if (fd.name().matches(".*_l")) { 
        ByteBuffer a = ByteBuffer.wrap(fd.getBinaryValue(), 
          fd.getBinaryOffset(), fd.getBinaryLength()); 
        long testLong = a.getLong(0); 
        sdoc.addField(fd.name(), testLong); 
       } 
       //Dynamic Dates 
       else if(fd.name().matches(".*_dt")) { 
        ByteBuffer a = ByteBuffer.wrap(fd.getBinaryValue(), 
         fd.getBinaryOffset(), fd.getBinaryLength()); 
        Date dt = new Date(a.getLong()); 
        sdoc.addField(fd.name(), dt); 
       } 
       //... 
      }     
     } 
     results.add(sdoc); 
    } 
} 

+0

설명을 위해 모든 단일 요청에 추가 필터를 추가하기위한 목적으로이 사용자 지정 RequestHandler를 만들었습니다. 그 맞습니까? – rfeak

+0

@rfeak - 간단한 대답, 예. 관련성이 있습니까? 당신이 제안하는 어떤 다른 접근법? – 12N

+1

예. 올바르게 (2 년이 지났음) 회상하면 각 쿼리에 추가되는 XML 파일에 기본 필터를 추가하는 방법이 있습니다. 그런 다음 기본 필터는 다른 것과 마찬가지로 FilterCache에 캐시됩니다. 다른 필터와의 통합은 매우 빠르며 문서를 가져 와서 필터를 적용 할 필요가 없습니다. 당신이 그 접근법을 고려했는지 확실하지 않습니다. – rfeak

답변

0

당 작전 요청이 비록

나는 당신의 문제를 해결하기 위해 다른 옵션을 제안, 특정 질문에 대답하지 않습니다.

모든 쿼리에 필터를 추가하려면 SolrConfig.xml 파일의 StandardRequestHandler에 "appends"섹션을 추가 할 수 있습니다. "fl"(필터를 의미) 섹션을 추가하고 필터를 추가하십시오. StandardRequestHandler를 통해 파이프 된 모든 요청에는 필터가 자동으로 추가됩니다.

이 필터는 다른 필터처럼 처리되므로 FilterCache에 캐시됩니다. 그 결과 쿼리 시간에 (docIds를 통해) 상당히 빠른 필터링이 이루어집니다. 이렇게하면 필터링 기준을 적용하기 위해 솔루션에서 개별 문서를 가져 오지 않아도됩니다.