Bobo源代码分析(BoboIndexReader和BoboSubBrowser)

本文介绍了BoboIndexReader类的功能及其实现原理,包括其如何处理多IndexReader的情况,并详细解释了浏览搜索功能的实现流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BoboIndexReader继承于FilterIndexReader,这个类是对IndexReader的进一步包装,
首先看构造函数

protected BoboIndexReader(IndexReader reader,
                            Collection<FacetHandler<?>> facetHandlers,
                            Collection<RuntimeFacetHandlerFactory<?,?>> facetHandlerFactories,
                            WorkArea workArea,
                            boolean useSubReaders) throws IOException
  {
    super(useSubReaders ? new MultiReader(createSubReaders(reader, workArea), false) : reader);
    if(useSubReaders)//是否使用多IndexReader
    {
      _dir = reader.directory();
      BoboIndexReader[] subReaders = (BoboIndexReader[])in.getSequentialSubReaders();
      if(subReaders != null && subReaders.length > 0)
      {
        _subReaders = subReaders;
        
        int maxDoc = 0;
        _starts = new int[_subReaders.length + 1];
        for (int i = 0; i < _subReaders.length; i++)
        {
          _subReaders[i]._dir = _dir;
          if(facetHandlers != null) _subReaders[i].setFacetHandlers(facetHandlers);
          _starts[i] = maxDoc;
          maxDoc += _subReaders[i].maxDoc();
        }
        _starts[_subReaders.length] = maxDoc;
      }
    }
    _runtimeFacetHandlerFactories = facetHandlerFactories;
    _runtimeFacetHandlerFactoryMap = new HashMap<String,RuntimeFacetHandlerFactory<?,?>>();
    if (_runtimeFacetHandlerFactories!=null)
    {
      for(RuntimeFacetHandlerFactory<?,?> factory : _runtimeFacetHandlerFactories)
      {
        _runtimeFacetHandlerFactoryMap.put(factory.getName(), factory);
      }
    }
    _facetHandlers = facetHandlers;
    _workArea = workArea;
  }


BoboIndexReader在多IndexReader的情况下,将所有的IndexReader的doc[]虚拟成一个,后一个Index的doc的id号在前面所有的indexReader的doc总数的基础上相加
_starts 是一个int[ ]类型的数组,保存了每一个IndexReader的第一个doc在这个虚拟的大的doc[]中的位置

 

 

搜索的时候最主要的函数是browse( ),多个BoboIndexReader的情况下,最终是调用的BoboSubBrowser中的

browse()函数:

 

public BrowseResult browse(BrowseRequest req) throws BrowseException
  {
    if (_reader == null)
      return new BrowseResult();

    final BrowseResult result = new BrowseResult();

    long start = System.currentTimeMillis();
    //创建排序收集器,这里返回得到的是SortCollectorImpl的实例
    SortCollector collector = getSortCollector(req.getSort(),req.getQuery(), req.getOffset(), req.getCount(), req.isFetchStoredFields(),false);
    
    Map<String, FacetAccessible> facetCollectors = new HashMap<String, FacetAccessible>();
    //搜索过程
    browse(req, collector, facetCollectors);
    BrowseHit[] hits = null;

    try
    {
        //收集命中结果
        hits = collector.topDocs();
    }
    catch (IOException e)
    {
      logger.error(e.getMessage(), e);
      hits = new BrowseHit[0];
    }
    
    Query q = req.getQuery();
    if (q == null){
    	q = new MatchAllDocsQuery();
    }
    if (req.isShowExplanation()){
    	for (BrowseHit hit : hits){
    		try {
				Explanation expl = explain(q, hit.getDocid());
				hit.setExplanation(expl);
			} catch (IOException e) {
				logger.error(e.getMessage(),e);
			}
    	}
    }
    result.setHits(hits);
    result.setNumHits(collector.getTotalHits());
    result.setTotalDocs(_reader.numDocs());
    result.addAll(facetCollectors);
    long end = System.currentTimeMillis();
    result.setTime(end - start);
    return result;
  }
 

 

bobo娱乐是一款由网易官方开发的一款大型在线娱乐社区软件。软件拥有技术先进的视频直播间,能够实现数万人同时在线视频聊天、在线K歌跳舞、视频交友。才艺美女、综艺大咖、草根偶像、奇葩怪才全部聚集于此,大家可以一起唱歌、跳舞、聊天、吐槽、谈心事、玩游戏,是目前国内最专业的社交平台。主播还可以通过虚拟的礼物,获得粉丝的回报。轻轻松松完成日常在线娱乐功能,需要的朋友快来下载吧! bobo娱乐的安装   把下载好的安装包解压到当前文件夹,之后双击【Setup_BoBo_Client_Netease.exe】运行文件进行安装,打开的时候会出现安装框,依次开始安装,依照步骤点击下一步,并选择同意协议软件安装位置即可。     点击【完成】按钮,bobo娱乐软件安装过程就完成了。 bobo娱乐的使用   安装完成后,点击【bobo娱乐】快捷方式即可进入方bobo娱乐软件。如图所示,这是软件的登录界面,用户在这里需要登录自己的账号后台,用户可以注册新账号,也可以用QQ或微博登录。   如图所示,这是软件的直播大厅界面,用户可以点击界面的各种按钮实现自己所需要的各种功能。     如图所示,这是软件的主播排行榜界面。软件的功能就大致介绍到这里了,软件其余的具体功能就有小伙伴们自己去发掘吧。 bobo娱乐的卸载   依次选择开始-> 所有程序 ->bobo娱乐软件->卸载bobo娱乐软件。 或者依次打开我的电脑->卸载或更改程序->卸载你所卸载的软件,您可以用 Window XP控制面板中的添加或删除程序功能,或用 Windows Vista、Windows 7中的程序功能删除bobo娱乐软件, 然后点击开始卸载,按步骤依次点击下一步,直至完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值