首页 > 其他分享 >lucene内部的合并策略

lucene内部的合并策略

时间:2023-09-12 14:11:16浏览次数:36  
标签:策略 mergeFactor minMergeSize MiB 合并 lucene KiB 842

原文链接:http://java.dzone.com/news/merge-policy-internals-solr?mz=33057-solr_lucene
solr(or lucene)内部的合并策略是怎样的呢?

选择哪些段(segment)需要被合并,是基于名为MergePolicy的抽象类决定的。这个类创建了一个合并规则类MergeSpecification:由OneMerge对象组成的一个列表集合。其中的每一个代表了一个单独的合并操作;被指定的所有段都将被合并为一个新的段。

在索引改变之后,IndexWriter会调用MergePolicy来获取一个MergeSpecification;然后开始调用MergeScheduler,该类负责合并任务的执行。MergeScheduler主要有两个实现类:ConcurrentMergeScheduler为并行合并的线程类(多线程),SerialMergeScheduler则会将所有的合并操作在当前线程进行(单线程)。当合并的时间到了,IndexWriter会将合并的任务交给SegmentMerger来做。

所以,如果想了解什么时候段会被合并、为什么有些段被合并了而有些没有、或者起来类似的一些问题,我们都应该了解一下MergePolicy。

MergePolicy有很多的实现,我们来看一下它的默认实现类LogByteSizeMergePolicy。MergePolicy定义了三个抽象方法来构造MergeSpecification:
     1. findMerges() 将会在索引被改变时被调用
     2. findMergesForOptimize() 在optimize操作时被调用
     3. findMergesToExpungeDeletes() 在删除操作时被调用

Step by step
下面先对合并策略作一个简短的概念性描述,请看下图:
1. 将段按name排序
2. 将已存在的段分组(level),每个组(level)都是连续段的集合
3. 对于每个组,确定将要被合并的段


Parameters
下面来说明一下在合并索引时需要用到的一些参数:
1. mergeFactor: 这个参数有多种含义,比如有多少段将被合并为新段;每个组的最大段数和每个段的跨度,可以在solrconfig.xml里设置
2. minMergeSize:小于该值的所有段将会被归于一个组中,固定值
3. maxMergeSize:大于该值的所有段将不会被合并,固定值
4. maxMergeDocs:所有文档数大于该值的段将不会被合并,以上参数均在solrconfig.xml中定义

Constructing the levels
让我们看一下组(level)是如何被构造的。为确定第一个组,算法会查询最大合并段大小,我们叫它levelMaxSize。如果这个值小于minMergeSize,那么所有的段都会被归为一个组。否则,levelMaxSize的值将为:

这个算法的大致含义为:levelMaxSize的值大约为levelMaxSize除以mergeFactor的0.75次方(如果1被使用则替代0.75),但是如果算出的值小于minMergeSize,则用minMergeSize代替。

通过这个计算,算法将会选择哪些段属于当前的组。首先,它讲找一个大于或等于levelMinSize的段,如果其他旧的段都比它小,则被归为一个组。下一个组也会使用相同的方式,但是会找比上一个段更新的段作为比较段。

下面举个例子,设mergeFactor=10 and minMergeSize=1.6MiB.

首先取第一个段200M,得出levelMaxSize为36M,那么只有I比它大;分为一组,继续选择8.9M得出levelMaxSize为1.6M,计算后与6.5M分为一组……

但是,如果你不了解算法本身,它会构造出你无法预料的组。举个例子,下面的表中,依然设置mergeFactor=10 and minMergeSize=1.6MiB.
Java代码  收藏代码

  1. Segment     Size  
  2. a   200 MiB  
  3. l   88 MiB  
  4. m   8.9 MiB  
  5. n   6.5 MiB  
  6. o   1.4 MiB  
  7. p   842 KiB  
  8. q   842 KiB  
  9. r   842 KiB  
  10. s   842 KiB  
  11. t   842 KiB  
  12. u   842 KiB  
  13. v   842 KiB  
  14. w   842 KiB  
  15. x   160 MiB  

会有多少组呢?来看一下:最大的段大小为200M,则levelMinSize为36M;最新的比levelMinSize 大的段是x,所以第一个组包括x并且所有的段都比它旧。那么,这将只有一个组!

Choosing which segments to merge
在定义完组之后,MergePolicy将会选择哪些段会被合并:单独的分析每个组,如果一个组小于mergeFactor 个段,那么该组会被忽略(不合并)。否则,所有在该组中的段都将被合并为一个新的段;如果组中有大于maxMergeFactor或maxMergeDocs的段,则该段被忽略。

回到第2个例子中,当只有一组段需要合并时,合并结果为:
Java代码  收藏代码
  1. Segment     Size  
  2. u   842 KiB  
  3. v   842 KiB  
  4. w   842 KiB  
  5. x   160 MiB  
  6. y   311 MiB  

minMergeSize and maxMergeSize
这个说说这两个参数。目前这两个值在lucene中是硬编码的,他们的值为:
   minMergeSize:1.6M 所有比1.6M小的段都将被归为1组
   maxMergeSize:2G   所有大于2G的段都不会再被合并

Conclusion
其实这个算法并不复杂,如果想知道在你的索引添加多个文档时发生了什么,了解其内部机制是有必要的。同时,了解合并策略是如何工作的,更能帮助你设定一些参数的值(如mergeFactor和maxMergeDocs)。
















  • 大小: 23.9 KB
  • 大小: 1.3 KB
  • 大小: 18.3 KB

标签:策略,mergeFactor,minMergeSize,MiB,合并,lucene,KiB,842
From: https://www.cnblogs.com/cuihongyu3503319/p/17696019.html

相关文章

  • Redis缓存数据和表数据一致性之延时双删策略
    一、什么是Redis延时双删?1、延迟双删策略是分布式系统中数据库存储和缓存数据保持一致性的常用策略,但它不是强一致。不管哪种方案,都无法绝对避免Redis存在脏数据的问题,只能减轻这个问题2、因为双删策略执行的结果是把redis中保存的那条数据删除了,以后的查询就都会去查询数据库......
  • Python合并不同Word并同时添加多个分页符的方法
      本文介绍基于Python,实现对多个Word文档加以自动合并,并在每次合并时按要求增添一个分页符的方法。  现有多个Word文档文件,需将其按名称顺序合并为一个新的Word文件,且需保证每一次合并时,都另起一页(即新的Word文件一页中,不能出现两个及以上的原本单个Word文件的内容)。  一般......
  • 零代码编程:用ChatGPT批量合并ts文件
    文件夹中有很多个ts后缀的视频文件,要合并成一个视频文件,在ChatGPT中可以这样输入提示词:你是一个Python编程专家,要完成一个批量合并ts文件的任务,具体步骤如下:打开文件夹:C:\Users\dell\Pictures\CameraRoll\index-f1-v1-a1_20230825221408\Part_0按照文件名称的顺序将文件夹中所有.t......
  • P3201 [HNOI2009] 梦幻布丁 启发式合并,时间复杂度
    [HNOI2009]梦幻布丁一种很暴力,很容易想到,但时间复杂度不对的做法:既然每一次修改是以颜色作为单位的,那就用set或者链表(vector)维护每一个颜色出现的位置。将颜色\(x\)改为\(y\)的时候,遍历\(list_x\)的每一个点,判断其左右是否为\(y\),更新ans(不同颜色块数量)时间复杂度最大为......
  • 消费者重试失败策略
          ......
  • 数据同步策略
       ......
  • 代码随想录:● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98
     654.最大二叉树 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个......
  • git 本地master分支合并其他分支
    一、切换到主分支gitcheckoutmaster二、主分支合并其他分支gitmergeyf_dev三、切换到其他分支gitcheckoutyf_dev四、推送到远程分支gitpush-uoriginyf_dev......
  • 路由还要玩策略!!!
    路由策略:作用:1.路由过滤            2.修改属性 -BGP 过滤路由:工具:acl   prefix-list(前缀-掩码列表)   route-policyAcl      基本的acl抓取路由      不看掩码Prefix-list  抓取路由     既看路由也看掩码route-policy  能......
  • 直播策略之外滩
    看到一个直播博主,大概粉丝数量为三十几万,很多了。而且直播的内容很简单,就是晚间天色黑了,等外滩的灯光亮起来,在南京东路到外滩,外滩纪念塔到外滩南延走走。拍的内容有对岸浦东的建筑群,这边浦西的建筑群,以及街上游玩的游客。然后呢,就是观众们在下面刷屏,可以选择性回答一些问题。我感觉......