solrj是一款开源的访问solr服务器的三方插件,通过这个插件,我们可以完成solr admin页面能够完成以及不能完成的操作,查询作为solr的一个使用频率最高的操作当然也是使用最广的,使用solrj实现查询操作,基本上离不开下面几个类:SolrClient、SolrQuery以及QueryRequest,solrclient使用下面两个类型参数的方法:
代码语言:javascript复制 public final NamedList<Object> request(final SolrRequest request) throws SolrServerException, IOException {
return request(request, null);
}
public QueryResponse query(SolrParams params) throws SolrServerException, IOException {
return query(null, params);
}
通过上面两个方法我们可以看到以下不同点:
1.返回类型不同,request返回的是一个原始的json格式数据,要想获取具体查到到的文档需要剥丝抽茧获取,而query方法则返回了组装后的数据,我们获取想要的结果更容易些
2.输入参数类型不一样,SolrRequest与SolrParams类的关系是组合关系,SolrRequest包含一个SolrParams实例
3.SolrQuery对查询进行了层级提升,不像使用SolrRequest时使用的SolrParams那样使用solr查询的基本语法
至于返回结果不同主要在于QueryResponse类的setResponse方法内部对solr返回的数据进行了简单的组装
代码语言:javascript复制 @Override
public void setResponse( NamedList<Object> res )
{
super.setResponse( res );
// Look for known things
for( int i=0; i<res.size(); i ) {
String n = res.getName( i );
if( "responseHeader".equals( n ) ) {
_header = (NamedList<Object>) res.getVal( i );
}
else if( "response".equals( n ) ) {
_results = (SolrDocumentList) res.getVal( i );
}
else if( "sort_values".equals( n ) ) {
_sortvalues = (NamedList<ArrayList>) res.getVal( i );
}
else if( "facet_counts".equals( n ) ) {
_facetInfo = (NamedList<Object>) res.getVal( i );
// extractFacetInfo inspects _results, so defer calling it
// in case it hasn't been populated yet.
}
else if( "debug".equals( n ) ) {
_debugInfo = (NamedList<Object>) res.getVal( i );
extractDebugInfo( _debugInfo );
}
else if( "grouped".equals( n ) ) {
_groupedInfo = (NamedList<Object>) res.getVal( i );
extractGroupedInfo( _groupedInfo );
}
else if("expanded".equals(n)) {
NamedList map = (NamedList) res.getVal(i);
_expandedResults = map.asMap(1);
}
else if( "highlighting".equals( n ) ) {
_highlightingInfo = (NamedList<Object>) res.getVal( i );
extractHighlightingInfo( _highlightingInfo );
}
else if ( "spellcheck".equals( n ) ) {
_spellInfo = (NamedList<Object>) res.getVal( i );
extractSpellCheckInfo( _spellInfo );
}
else if ("clusters".equals(n)) {
_clusterInfo = (ArrayList<NamedList<Object>>) res.getVal(i);
extractClusteringInfo(_clusterInfo);
}
else if ( "suggest".equals( n ) ) {
_suggestInfo = (Map<String,NamedList<Object>>) res.getVal( i );
extractSuggesterInfo(_suggestInfo);
}
else if ( "stats".equals( n ) ) {
_statsInfo = (NamedList<Object>) res.getVal( i );
extractStatsInfo( _statsInfo );
}
else if ( "terms".equals( n ) ) {
_termsInfo = (NamedList<NamedList<Object>>) res.getVal( i );
extractTermsInfo( _termsInfo );
}
else if ( "moreLikeThis".equals( n ) ) {
_moreLikeThisInfo = (NamedList<SolrDocumentList>) res.getVal( i );
}
else if ( CursorMarkParams.CURSOR_MARK_NEXT.equals( n ) ) {
_cursorMarkNext = (String) res.getVal( i );
}
}
if(_facetInfo != null) extractFacetInfo( _facetInfo );
}
这篇文章对比的目的不是说SolrRequest一无是处,SolrQuery最终还是通过创建SolrRequest对象,然后发起请求的,这个体现了代理模式的效果,SolrQuery只负责拼装查询需要的参数,发送Solr请求以及结果处理都由QueryRequest的父类SolrRequest完成。
总结:
1.优先使用SolrQuery以及SolrClient的query方法查询