2014-02-26 1 views
4

Solr을 쿼리하기 위해 SolrJ 기반 클라이언트를 사용하고 패싯 이름/값 쌍이 제외 된 HTTP 요청을 구성하려고했습니다. 내가 작업하고있는 웹 인터페이스에는 하나 이상의 패싯 값을 제외 할 수있는 추가 기능이 추가되었습니다. 도메인, 콘텐츠 유형 및 작성자의 세 가지 패싯 필드가 있으며 각각에 대한 제외를 통해 패싯을 처리 할 수 ​​있기를 원합니다. 모양을SolrJ를 통한 필터 쿼리 제외

/solr/solrbase/select?q=Dickens&fq=-author:Dickens%2c+Janet&wt=json&indent=true 

는 XML 덤프 반면 : 예를 들어, q = Dickensfq=-author:Dickens, Janet는 다음과 같은 HTTP 요청을 구성합니다 지금까지

   <facets> 
       <facet name="author"> 
       <facetEntry count="20">Dickens, Charles</facetEntry> 
       <facetEntry count="10">Dickens, Sarah</facetEntry> 
       </facet> 
      </facets> 

, 내가 함께 일하고 자바 구현은 처리 할 것 같습니다하지 않습니다 필터 쿼리 제외 : 나는이 라인을 따라 뭔가를 사용하는 것이 좋습니다했다

private HttpSolrServer solrServer; 
solrServer = new HttpSolrServer("http://localhost:8983/solr/"); 

private static final String CONFIG_SOLR_FACET_FIELD = "facet_field"; 
private String[] _facetFields = new String[] {"author"}; 

private static final String CONFIG_SOLR_FACETS = "facets" 
    Element el = myParams.getChild(CONFIG_SOLR_FACETS); 

     _facetUse = el.getAttributeValue("useFacets", "true"); 
     _facetMinCount = el.getAttributeValue("minCount", String.valueOf(1)); 
     _facetLimit = el.getAttributeValue("limit", String.valueOf(20)); 


List vals = el.getChildren(CONFIG_SOLR_FACET_FIELD); 
     if (vals.size() > 0) { 
      _facetFields = new String[vals.size()]; 
      for (int i=0; i < vals.size(); i++) { 
      _facetFields[i] = ((Element)vals.get(i)).getTextTrim(); 
      } 
     } 

SolrQuery query = new SolrQuery(); 
query.setQuery(qs); 


List facetList = doc.getRootElement().getChildren("facet"); 
        Iterator<String> it = facetList.iterator(); 
        while (it.hasNext()) { 
         Element el = (Element)it.next(); // 
         String name = el.getAttributeValue("name"); 
         String value = el.getTextTrim(); 
         if (name != null && value != null) {  
          facets.add(name+":"+value); 
         } 

        } 


query.setQuery(qs). 
      setFacet(Boolean.parseBoolean(_facetUse)). 
      setFacetMinCount(Integer.parseInt(_facetMinCount)). 
      setFacetLimit(Integer.parseInt(_facetLimit)). 

     for (int i=0; i<_facetFields.length; i++) { 
      query.addFacetField(_facetFields[i]);  
     }; 

     for (int i=0; i<facets.size(); i++) { 
      query.addFilterQuery(facets.get(i)); 
     }; 
    return query; 

    } 

:

SolrQuery solrQuery = new SolrQuery(); 
    solrQuery.set(CommonParams.FQ, “-author:Dickens,Janet”); 

그러나 이것은 하드 코드 된 접근 방식 인 것으로 보이며 모든 3면과 모든면 값에 쉽게 적용 할 수 없습니다. this을 살펴 보았지만 현재 코드에서 제외 변형을 어떻게 포함시켜야하는지 명확하지 않습니다. 이걸로 도울 수 있니? 실제로

감사의 SOLR 인스턴스가 실제로 어떻게 코드가 SOLR 쿼리를 준비/구축,하지만도 포함해야 첨부 1

I.

편집 질의 :

private QueryResponse execQuery(SolrQuery query) throws SolrServerException { 
    QueryResponse rsp = solrServer.query(query); 
    return rsp;  

} 

또한 Solr 쿼리를 변환하는 코드를 게시하면 도움이됩니다. 웹 응용 프로그램에서 이해할 수있는 무언가로 측면에 대한 응답 :

Element elfacets = new Element("facets"); 
      List<FacetField> facets = rsp.getFacetFields(); 
      if (facets != null) { 
       int i = 0; 
       for (FacetField facet : facets) { 
        Element sfacet = new Element("facet"); 
        sfacet.setAttribute("name", facet.getName()); 

        List<Count> facetEntries = facet.getValues(); 

        for(FacetField.Count fcount : facetEntries) { 
         Element facetEntry = new Element("facetEntry"); 
         facetEntry.setText(fcount.getName()); 
         facetEntry.setAttribute("count", String.valueOf(fcount.getCount())); 
         sfacet.addContent(facetEntry); 
        } 
        elfacets.addContent(sfacet); 

      } 
      root.addContent(elfacets); 
     } 


     doc.addContent(root); 

     return doc; 
    } 

"facets" 웹 애플리케이션에 의해 처리로 측면에 SOLR의 측면을지도하는 방법에 대한 규칙을 포함하는 XSLT,에 지나지 않는다. 2

편집 나는 EDIT 1에 제시된 코드에 의해 호출되는 "facets" 템플릿, 첨부 :

<xsl:template name="facets"> 
       <xsl:param name="q" /> 
       <xsl:analyze-string select="$q" regex='AND facet_(.*?):\(("?.*?"?)\)'> 
         <xsl:matching-substring> 
         <xsl:choose> 
         <xsl:when test="regex-group(1) = 'author'"> 
            <facet name="author"><xsl:value-of select="regex-group(2)" /></facet> 
         </xsl:when>  
         </xsl:choose> 
         </xsl:matching-substring> 
         <xsl:non-matching-substring> 
         <!--<xsl:analyze-string select="$q" regex='AND NOT facet_(.*?):\(("?.*?"?)\)'> 
         <xsl:matching-substring> 
         <xsl:choose> 
         <xsl:when test="regex-group(1) = 'author'"> 
            <facet name="author"><xsl:value-of select="regex-group(2)" /></facet> 
         </xsl:when> 
         </xsl:choose> 
        </xsl:matching-substring> 
        </xsl:analyze-string>--> 
        </xsl:non-matching-substring> 
       </xsl:analyze-string> 
    </xsl:template> 
</xsl:stylesheet> 

템플릿 만 author면 기능을,하지만 난 총 3 개면이있다. 내 웹 응용 프로그램을 제외한 측면에 대한 다음과 같은 구문을 가지고 있음을 주목해야한다 : 나는 당신이 어떤 방법 안에 다음 줄을 확신

AND NOT facet_author:("Dickens, Janet") 
+1

필요에 따라'fq'를 제외 시키시겠습니까? 쿼리에 매개 변수가 전달되는 것을 제어 할 수 있습니까? – buddy86

+0

네, 그게 정확히 제가하고 싶은 것입니다! 매개 변수를 쿼리에 어떻게 전달합니까? 어디에? 예제를 제공 할 수 있습니까? 템플릿 패싯을 보여주는 추가 편집을 참조하십시오. 도와 줘서 고마워. – paranza

답변

2

. fq 부분을 하드 코딩하는 대신 거기에 몇 가지 변수를 지정하십시오.

SolrQuery solrQuery = new SolrQuery(); 
solrQuery.set(CommonParams.FQ, “-author:Dickens,Janet”); 

fq를 사용해야하는 경우 적절한 매개 변수를 전달하십시오 (예 : "-author : Dickens, Janet"). 그렇지 않으면 빈 문자열을 전달하십시오.따라서 검색어는

/solr/solrbase/select?q=Dickens&fq=&wt=json&indent=true 

과 비슷합니다. 그런 다음 검색어의 패싯 부분을 추가하십시오. 검색어가 fq=인데도 오류가 발생하지 않습니다. 기본적으로 fq 부분에서는 작동하지 않습니다. 그러나 나머지 쿼리는 정상적으로 작동합니다.

희망이 도움이 될 것입니다.

+0

답장 지연에 사과하지만 멀리있었습니다. 귀하의 예제에서와 같이 적절한 매개 변수를 전달할 수 없습니다. solrQuery.set (CommonParams.FQ)와 같은 것을 사용 하시겠습니까? 정말 고마워! – paranza