SolrQuery VS QueryRequest

编程入门 行业动态 更新时间:2024-10-28 06:34:56

<a href=https://www.elefans.com/category/jswz/34/1549337.html style=SolrQuery VS QueryRequest"/>

SolrQuery VS QueryRequest

solrj是一款开源的访问solr服务器的三方插件,通过这个插件,我们可以完成solr admin页面能够完成以及不能完成的操作,查询作为solr的一个使用频率最高的操作当然也是使用最广的,使用solrj实现查询操作,基本上离不开下面几个类:SolrClient、SolrQuery以及QueryRequest,solrclient使用下面两个类型参数的方法:

  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返回的数据进行了简单的组装

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

更多推荐

SolrQuery VS QueryRequest

本文发布于:2024-03-04 15:58:04,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1709725.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:SolrQuery   QueryRequest

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!