SolrQuery VS QueryRequest

2022-03-28 19:45:32 浏览数 (1)

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方法查询

0 人点赞