NamedList<Object> 抛出类转换异常

问题描述 投票:0回答:2

我想形成一个 NamedList 对象,如下所示:

response={numFound=57279026,start=0,docs=[SolrDocument{timestamp_update=Thu Jan 01 01:00:00 CET 1970}]}}

当我这样做时,当我的代码尝试访问结果时,我会抛出异常:

SolrDocumentList results = response.getResults();

**java.lang.ClassCastException: org.apache.solr.common.util.SimpleOrderedMap cannot be cast to org.apache.solr.common.SolrDocumentList**

我应该如何创建NamedList,这样它就不会抛出异常

这是我的做法:

NamedList<Object> nl = new SimpleOrderedMap<>();
private static  Map<String, Object> solrDocumentMap= new HashMap<>();
solrDocumentMap.put("timestamp_update", TIMESTAMP_UPDATE);
solrDocument= new SolrDocument(solrDocumentMap);
solrDocumentList.add(solrDocument);

nl.add("numFound", "57279026");
nl.add("start", "0");
 nl.add("docs", solrDocumentList);

 NamedList<Object> nl1 = new NamedList<>(Collections.singletonMap("response", nl));
 response.setResponse(nl1);

这是 QueryResponse 的内置类,它将响应转换为 SolarDocument

  public void setResponse(NamedList<Object> res) {
        super.setResponse(res);

        for(int i = 0; i < res.size(); ++i) {
            String n = res.getName(i);
            if ("responseHeader".equals(n)) {
                this._header = (NamedList)res.getVal(i);
            } else if ("response".equals(n)) {
                this._results = (SolrDocumentList)res.getVal(i);
            } else if ("sort_values".equals(n)) {
                this._sortvalues = (NamedList)res.getVal(i);
            } else if ("facet_counts".equals(n)) {
                this._facetInfo = (NamedList)res.getVal(i);
            } else if ("debug".equals(n)) {
                this._debugInfo = (NamedList)res.getVal(i);
                this.extractDebugInfo(this._debugInfo);
            } else if ("grouped".equals(n)) {
                this._groupedInfo = (NamedList)res.getVal(i);
                this.extractGroupedInfo(this._groupedInfo);
            } else if ("expanded".equals(n)) {
                NamedList map = (NamedList)res.getVal(i);
                this._expandedResults = map.asMap(1);
            } else if ("highlighting".equals(n)) {
                this._highlightingInfo = (NamedList)res.getVal(i);
                this.extractHighlightingInfo(this._highlightingInfo);
            } else if ("spellcheck".equals(n)) {
                this._spellInfo = (NamedList)res.getVal(i);
                this.extractSpellCheckInfo(this._spellInfo);
            } else if ("clusters".equals(n)) {
                this._clusterInfo = (ArrayList)res.getVal(i);
                this.extractClusteringInfo(this._clusterInfo);
            } else if ("suggest".equals(n)) {
                this._suggestInfo = (Map)res.getVal(i);
                this.extractSuggesterInfo(this._suggestInfo);
            } else if ("stats".equals(n)) {
                this._statsInfo = (NamedList)res.getVal(i);
                this.extractStatsInfo(this._statsInfo);
            } else if ("terms".equals(n)) {
                this._termsInfo = (NamedList)res.getVal(i);
                this.extractTermsInfo(this._termsInfo);
            } else if ("moreLikeThis".equals(n)) {
                this._moreLikeThisInfo = (NamedList)res.getVal(i);
            } else if ("nextCursorMark".equals(n)) {
                this._cursorMarkNext = (String)res.getVal(i);
            }
        }

        if (this._facetInfo != null) {
            this.extractFacetInfo(this._facetInfo);
        }

    }


java collections
2个回答
0
投票

终于找到解决办法了,希望对大家有帮助。我从 Solr 获得了 XML 格式的响应,并读取了该文件并使用 XMLResponseParser 对其进行了解析。不知何故,JsonParser 不适用于 Solar,如果您使用 java 反序列化,Solr 中存在一个不兼容的错误。

这也适用于查询响应类的内部类型转换。


protected QueryResponse getResponse(String fileName) throws IOException {

        Path path = Paths.get(resDir + "/" + fileName);
        InputStream body= new FileInputStream(path.toFile());
        NamedList<Object> result= processResponse(body, null);
        QueryResponse response = new QueryResponse();
        response.setResponse(result);
        return response;
    }

    private NamedList<Object> processResponse(InputStream body, Object o) {
        XMLResponseParser parser= new XMLResponseParser();
        NamedList<Object> result= parser.processResponse(body, "UTF-8");
        return result;
    }


0
投票

我在使用 Solrj 9.4.0 时遇到了类似的问题。 我通过手动转换给定的 Map 并创建 SuggesterResult 的新实例找到了另一个解决方案。

public void mySuggestion(String input){

    SolrClient client; // create a Http2SolrClient

    SolrQuery suggQuery = new SolrQuery();
    suggQuery.setRequestHandler("/suggest");
    suggQuery.setParam("suggest", true);
    suggQuery.setParam("suggest.q", input);

    try {
        QueryRequest qreq = new QueryRequest(suggQuery, SolrRequest.METHOD.GET);
        NamedList<Object> res = client.request(qreq);

        for (int i = 0; i < res.size(); i++) {
            String n = res.getName(i);
            if ("suggest".equals(n)) {
                _suggestInfo = (Map<String, NamedList<Object>>) res.getVal(i);
                extractSuggesterInfo(_suggestInfo);
            }
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
}

private void extractSuggesterInfo(Map<String, NamedList<Object>> suggestInfo) {
        suggestResponse = new SuggesterResponse(convertMapToNamedList(suggestInfo));
    }

private NamedList<NamedList<Object>> convertMapToNamedList(Map<String, NamedList<Object>> map) {
    NamedList<NamedList<Object>> list = new NamedList<>();

    for (Map.Entry<String, NamedList<Object>> entry : map.entrySet()) {

        String key = entry.getKey();
        NamedList<Object> nl = entry.getValue();

        list.add(key, nl);
    }
    return list;
}
© www.soinside.com 2019 - 2024. All rights reserved.