Lucene源码分析 - MinShouldMatchSumScorer

本文深入分析Lucene 6.3.0中的MinShouldMatchSumScorer,探讨tail作为小顶堆的实现、nextDoc和advance的基本逻辑及详细代码,讨论其在满足最小匹配次数条件下的迭代器管理策略。
摘要由CSDN通过智能技术生成

本文的代码以lucene-core 6.3.0为准,包含MinShouldMatchSumScorer的iterator函数和执行原理。转载请注明出处。

0 基本信息

  • 对于每个迭代器而言,cost()代表这个迭代器的迭代路径长度,对于倒排表的迭代器,cost()返回的是倒排表的长度。
  • lead变量是链表,存的迭代器的当前位置的docId都相等。
  • tail变量是堆结构, 按照迭代器的cost构建的小顶堆。
  • head变量是优先队列,按照迭代器当前位置的docId从小到大排序。
  • freq表示lead链表中迭代器的数量。

1 源码分析

1.1 tail 是小顶堆

   tail是个小顶堆,删除元素只在堆顶进行,添加元素只在堆的末尾进行,删除元素的函数popTail:

  private DisiWrapper popTail() {
   
    final DisiWrapper result = tail[0];	 // 被删除的堆顶元素
    tail[0] = tail[--tailSize];		// 从堆尾取出一个元素放到堆顶,这个时候堆是不平衡的
    downHeapCost(tail, tailSize);	// 从堆顶往下调整堆
    return result;
  }

   从堆顶往下调整,将cost最小的迭代器不断往上推,downHeapCost函数如下:

  private static void downHeapCost(DisiWrapper[] heap, int size) {
   
    int i = 0;
    final DisiWrapper node = heap[0];	// 记录整个堆的 root节点
    int j = leftNode(i);
    if (j < size) {
   		// 判断当前的 root节点是否是叶子节点
      int k = rightNode(j);
      if (k < size && heap[k].cost < heap[j].cost) {
   
        // 如果当前节点有左右子节点,那么选出子节点中cost最小的那个,记录到 j
        j = k;
      }
      // 判断当前 root节点是否比左右子节点中cost最小的那个还要小
      // 如果是,则将最小的那个节点推到 root节点
      if (heap[j].cost < node.cost) {
   	
        do {
   
          // 将cost较小的节点推到 root节点
          heap[i] = heap[j];
          // 将 root节点设置为较cost小的节点
          i = j;
          j = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Lucene是一个全文检索引擎,它的核心数据结构包括倒排索引和正排索引。其中,倒排索引是Lucene最重要的数据结构之一,它通过将文档中的每个词都映射到包含该词的文档列表来实现快速的文本搜索。 Lucene中的Term Dictionary和Term Index是倒排索引中的两个重要组成部分。Term Dictionary用于存储所有唯一的词项(term),而Term Index则用于快速定位某个词项的位置。 在Lucene中,Term Dictionary和Term Index通常存储在磁盘上。Term Dictionary通常使用一种称为Trie树的数据结构来实现。Trie树是一种树形数据结构,它可以快速地查找某个字符串是否存在,以及在字符串集合中查找前缀匹配的字符串。 Term Index则通常存储在一个称为倒排索引表(Inverted Index Table)的结构中。倒排索引表是由一系列的倒排索引条目(Inverted Index Entry)组成的,每个倒排索引条目包含了一个词项及其在倒排索引中的位置信息,例如该词项在文档列表中出现的次数、该词项在哪些文档中出现等。 当进行文本搜索时,Lucene会首先在Term Dictionary中查找搜索关键词是否存在,然后通过Term Index快速定位到包含该词的文档列表,最后根据文档列表中的文档ID查找正排索引中具体的文档内容。这种基于倒排索引的搜索方式可以实现非常高效的文本搜索,是Lucene等全文检索引擎的核心技术之一。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值