我想形成一个 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);
}
}
终于找到解决办法了,希望对大家有帮助。我从 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;
}
我在使用 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;
}