2016-07-12 22 views
2

Ich habe ein Solr-Schema und ich versuche, Facet Pivoting zu tun, indem Sie mehrere Felder in facet.pivot -Parameter übergeben, während Sie einen Aufruf durch SolrJ. Meine Solr Antwort sieht etwa so aus:Parsing SolrJ Facetten-Pivot-Antwort

"facet_pivot": { 
    "boolean_value,int_value": [ 
    { 
     "field": "boolean_value", 
     "value": false, 
     "count": 1, 
     "pivot": [ 
     { 
      "field": "int_value", 
      "value": 364, 
      "count": 1 
     } 
     ] 
    }, 
    { 
     "field": "boolean_value", 
     "value": true, 
     "count": 2, 
     "pivot": [ 
     { 
      "field": "int_value", 
      "value": 406, 
      "count": 1 
     }, 
     { 
      "field": "int_value", 
      "value": 409, 
      "count": 1 
     } 
     ] 
    } 
    ] 
} 

Wie kann ich die obige Antwort mit SolrJ in Form von Nested analysieren Objekte heißen Pivotfield mit Beziehung von denen int_value unter welcher boolean_value fällt.

SolrJ Version versucht: 4.10.4

Update:

Wenn Sie einen Anruf durch SolrJ machen den SolrQuery überprüfen, die generiert wird. In meinem obigen Fall war der SolrQuery:

facet.pivot = boolean_value & facet.pivot = int_value

Solr hält oben schwenkt, wenn zwei verschiedene und Sie werden nicht verschachtelte Verschwenkung bekommen. Für Nested Verschwenkung Ihre SolrQuery sollte

facet.pivot haben = boolean_value, int_value

Antwort

0

hatte ich das gleiche Problem und eine einfache Tester Anwendung geschrieben. Es fragt Solr ab und schreibt die Pivot-Werte in StdOut als hierarchische Strings. Wenn es irgendwelche Vorschläge gibt, das besser umzusetzen, lass es mich wissen. Hier ist der Code:

public class Tester { 

    public static final String HIERARCHICAL_FACET_SEPARATOR = "/"; 

    public static void main(String[] args) throws SolrServerException, IOException { 
     CloudSolrClient solr = ... ; 
     SolrQuery query = new SolrQuery(...); 
     query.setFacet(true); 
     query.addFacetPivotField(new String[]{"field1,field2,field3"}); 
     QueryResponse result = solr.query(query); 
     NamedList<List<PivotField>> facetPivot = result.getFacetPivot(); 
     List<String> parsedPivotResult = parsePivotResult(facetPivot); 
     parsedPivotResult.forEach((s) -> { 
      System.out.println(s); 
     }); 
    } 

    private static List<String> parsePivotResult(final NamedList<List<PivotField>> pivotEntryList) { 
     final Set<String> outputItems = new HashSet<>(); 
     for (final Entry<String, List<PivotField>> pivotEntry : pivotEntryList) { 
      System.out.println("Key: " + pivotEntry.getKey()); 
      pivotEntry.getValue().forEach((pivotField) -> { 
       renderOutput(new StringBuilder(), pivotField, outputItems); 
      }); 
     } 
     final List<String> output = new ArrayList<>(outputItems); 
     Collections.sort(output); 
     return output; 
    } 

    private static void renderOutput(final StringBuilder sb, final PivotField field, final Set<String> outputItems) { 
     final String fieldValue = field.getValue() != null ? ((String) field.getValue()).trim() : null; 
     final StringBuilder outputBuilder = new StringBuilder(sb); 
     if (field.getPivot() != null) { 
      if (outputBuilder.length() > 0) { 
       outputBuilder.append(HIERARCHICAL_FACET_SEPARATOR); 
      } 
      outputBuilder.append(fieldValue); 
      outputItems.add(new StringBuilder(outputBuilder).append(" (").append(field.getCount()).append(")").toString()); 
      field.getPivot().forEach((subField) -> { 
       renderOutput(outputBuilder, subField, outputItems); 
      }); 
     } else { 
      if (outputBuilder.length() > 0) { 
       outputBuilder.append(HIERARCHICAL_FACET_SEPARATOR); 
      } 
      outputBuilder.append(fieldValue); 
      outputItems.add(outputBuilder.append(" (").append(field.getCount()).append(")").toString()); 
     } 
    } 
}