2017-02-14 4 views
0

Faceting in Solr Arbeit auf das Ergebnis von Abfrage zurückgegeben, aber ich möchte es auf Dokumente, die nach der Begrenzung der Zeilen auf einen Wert zurückgegeben werden. Zum Beispiel, wenn q 1500 Dokument zurückgeben und ich nehme erste 1000 Zeilen, I facetting möchte auf 1000 statt 1500 angewendet werden. Ich schreibe eine benutzerdefinierte Suchkomponente, um Facetten zu generieren. Es folgt die Umsetzung:Wie benutzerdefinierte Antwort in Solr Antwort mit Suchkomponente hinzufügen?

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 
import java.util.TreeMap; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.index.IndexableField; 
import org.apache.solr.handler.component.ResponseBuilder; 
import org.apache.solr.handler.component.SearchComponent; 
import org.apache.solr.request.SolrQueryRequest; 
import org.apache.solr.search.DocIterator; 
import org.apache.solr.search.DocList; 
import org.apache.solr.search.SolrIndexSearcher; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import com.biginfolabs.subfacet.MapSorter; 

public class SubFacetComponent extends SearchComponent { 
    private static Logger logger = LoggerFactory 
      .getLogger(SubFacetComponent.class); 
    private SolrQueryRequest req = null; 
    private long numDoc = 0; 

    // private static final String field = "annotations"; 

    @Override 
    public String getDescription() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void prepare(ResponseBuilder arg0) throws IOException { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void process(ResponseBuilder rb) throws IOException { 
     // TODO Auto-generated method stub 
     long startTime = System.currentTimeMillis(); 
     req = rb.req; 
     String[] fields = {"annotations"}; 
//    req.getParams().getParams("facet.field"); 
     logger.info("Facet component"); 

     if (rb.getResults() != null) { 
      DocList docs = rb.getResults().docList; 
      numDoc = docs.size(); 
      for (String field : fields) { 
       DocIterator docItr = docs.iterator(); 
       SolrIndexSearcher searcher = req.getSearcher(); 
       Map<String, List<String>> map = new HashMap<String, List<String>>(); 
       List<String> list = new ArrayList<String>(); 
       while (docItr.hasNext()) { 
        int docId = docItr.nextDoc(); 
        Document doc = searcher.doc(docId); 
        list.add(doc.get("id")); 
        Set<String> keySet = new HashSet<String>(); 
        if (doc.get(field) != null) { 
         IndexableField[] indexableFields = doc.getFields(field); 
         for (IndexableField indexableField : indexableFields) { 
          String str = indexableField.stringValue(); 
          String[] pathVariableArray = str.split("/"); 
          String key = ""; 
          String separator = ""; 
          for (String split : pathVariableArray) { 
           key += separator + split; 
           keySet.add(key); 
           separator = "/"; 
          } 
         } 
         for (String str : keySet) { 
          List<String> arrayList = new ArrayList<String>(); 
          if (map.containsKey(str)) { 
           arrayList = map.get(str); 
          } 
          arrayList.add(doc.getField("_version_").toString()); 
          map.put(str, arrayList); 
         } 
        } 
       } 
       System.out.println(list); 
       Map<String, Integer> finalMap = new HashMap<String, Integer>(); 
       for (String key : map.keySet()) { 
        if (map.containsKey(key)) { 
         finalMap.put(key, map.get(key).size()); 
         System.out.println(key + ": " + map.get(key).size()); 
        } 
       } 
       Map<String, TreeMap<String, Integer>> facetMap = new HashMap<String, TreeMap<String, Integer>>(); 
       TreeMap<String, Integer> sortedMap = new TreeMap(new MapSorter(
         finalMap)); 
       sortedMap.putAll(finalMap); 
       rb.rsp.add("subfacet", sortedMap); 
      } 

     } else { 
      logger.warn("You must specify 'subfacet' params in solr query !!"); 
     } 

     long enTime = System.currentTimeMillis(); 
     logger.info("Time taken to generate facets for " + numDoc 
       + " documents is " + (enTime - startTime) + " ms"); 
    } 

} 

Ich versuche, die Antwort hinzufügen rb.rsp.add("subfacet", sortedMap); verwenden, die Einstellung der subfacet in rsp Objekt zu sein scheint, aber die Antwort zurückgegeben UI SOLR dies nicht enthalten object.What bin ich fehlt Hier ? Es folgt mein select-Request-Handler:

<requestHandler name="/select" class="solr.SearchHandler"> 
    <!-- default values for query parameters can be specified, these 
     will be overridden by parameters in the request 
     --> 
    <lst name="defaults"> 
     <str name="echoParams">explicit</str> 
     <int name="rows">10</int> 
    </lst> 
     <arr name="last-components"> 
     <str>subfacetcomponent</str> 
    </arr> 

    </requestHandler> 

Edit: Es funktioniert gut, wenn solr als einzelner Knoten und einzelne Scherbe verwendet wird, aber nicht auf Cloud-Modus.

Antwort

0

behoben durch Überschreiben und Schreiben von Logik in public void finishStage(ResponseBuilder rb) anstelle von process().

Verwandte Themen