2016-07-12 19 views
2

私はSolrスキーマを持っており、SolrJを介して呼び出し中にfacet.pivotパラメータに複数のフィールドを渡して、ファセットピボットを実行しようとしています。私は、すなわちPivotFieldがint_valueがどのBOOLEAN_VALUEに該当その関係を持つネストされたオブジェクトの形でSolrJを使用して、上記応答を解析することができますどのように、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 
     } 
     ] 
    } 
    ] 
} 

:私のSolrの応答は以下のようになります。

SolrJバージョンは試してみました:4.10.4

更新:

あなたはSolrJを介してコールが生成されますSolrQueryをチェックします。私のような場合にはSolrQueryされました:

facet.pivot = BOOLEAN_VALUE & facet.pivot = int_value

Solrには、二つの異なるものとピボット上考慮し、ネストされたピボットを取得することはありません。ネストされたピボットのためにあなたのSolrQueryが

答えて

0

int_value

facet.pivot = BOOLEAN_VALUEを、持っている必要があります私は同じ問題を抱えていたし、簡単なテスターアプリケーションを書きました。 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()); 
     } 
    } 
}