2016-07-12 33 views
2

我有一個Solr架構,我試圖通過在通過SolrJ進行調用時傳遞facet.pivot參數中的多個字段來實現方面Pivoting。我Solr的反應看起來像如下:解析SolrJ方面樞軸響應

"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 
     } 
     ] 
    } 
    ] 
} 

如何,可以解析嵌套的表單對象即具有關係透視字段,其中int_value屬於哪個boolean_value下使用SolrJ上述迴應。

SolrJ版本嘗試:4.10.4

更新:

當您通過SolrJ打電話查詢獲取生成的SolrQuery。在我上面的情況下,SolrQuery是:

facet.pivot = boolean_value & facet.pivot = int_value

的Solr認爲上述支點爲兩個不同的人,你不會得到嵌套旋轉。對於嵌套的樞轉你的SolrQuery應該有

facet.pivot = boolean_value,int_value

回答

0

我有同樣的問題,並寫了一個簡單的測試應用程序。它查詢Solr並將透視值作爲分層字符串寫入StdOut。如果有任何建議可以更好地實施,請告訴我。代碼如下:

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()); 
     } 
    } 
}