Lucene随笔-BoomFilter布隆过滤器

2024-06-19 20:08

本文主要是介绍Lucene随笔-BoomFilter布隆过滤器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

lucene:6.5.1

简介

在luncene中布隆过滤器主要保存在.blm文件中,主要是用来判断特定的内容是否存在,比如在写入时判断文档id是否存在。此外,布隆过滤器只能判断特定内容肯定不存在,而不能得出肯定存在的结论。

实现

在luncene中不BloomFilter的具体实现主要是在FuzzySet。其入口为DefaultBloomFilterFactory,这里可以通过getSetForField函数获取一个布隆过滤器。这里的两个参数分别为

maxNumUniqueValues:可能存在的最大不同值的数量
desiredMaxSaturation: 包和度,接下来会具体介绍,默认为0.1


public FuzzySet getSetForField(SegmentWriteState state,FieldInfo info) {//Assume all of the docs have a unique term (e.g. a primary key) and we hope to maintain a set with 10% of bits setreturn FuzzySet.createSetBasedOnQuality(state.segmentInfo.maxDoc(), 0.10f);}

在FuzzySet.java中首先会根据输入的segment中的文档个数以及饱和度估算出一个set的容量。

 public static FuzzySet createSetBasedOnQuality(int maxNumUniqueValues, float desiredMaxSaturation){int setSize=getNearestSetSize(maxNumUniqueValues,desiredMaxSaturation);return new FuzzySet(new FixedBitSet(setSize+1),setSize, hashFunctionForVersion(VERSION_CURRENT));}

这里的FixBitSet是一个在lucene中非常重要的数据结构。它的其中一个用途用来存储文档号,用一个bit位来描述(存储)一个文档号。该类特别适合存储连续并且没有重复的int类型的数值。最好情况可以用8个字节来描述64个int类型的值。其结构如下,我们首先探究以下FixBitset的实现原理

在这里插入图片描述

  private final long[] bits; // Array of longs holding the bits private final int numBits; // The number of bits in useprivate final int numWords; // The exact number of longs needed to hold numBits (<= bits.length)

bit:存储bit的数组
numBits:参数numBits用来确定需要多少bit位来存储我们的int数值。如果我们另numBits的值为300,实际会分配一个64的整数倍的bit位。因为比300大的第一个64的倍数是 320 (64 * 5),所以实际上我们可以存储 [0 ~319]范围的数值。
numWords:表示bit数组的容量,即需要numWords的long值存储numsBit的数组

在FixBit中给我们提供了两个基本的操作函数:读取与写入

 public boolean get(int index) {assert index >= 0 && index < numBits: "index=" + index + ", numBits=" + numBits;int i = index >> 6;               // div 64// signed shift will keep a negative index and force an// array-index-out-of-bounds-exception, removing the need for an explicit check.long bitmask = 1L << index;return (bits[i] & bitmask) != 0;}public void set(int index) {assert index >= 0 && index < numBits: "index=" + index + ", numBits=" + numBits;int wordNum = index >> 6;      // div 64long bitmask = 1L << index;bits[wordNum] |= bitmask;}

此外BitSet还提供了用户不同BitSet之间的交并集操作。

然后我们接下来看一下FuzzySet中的插入和查询操作。

public void addValue(BytesRef value) throws IOException {    int hash = hashFunction.hash(value);if (hash < 0) {hash = hash * -1;}// Bitmasking using bloomSize is effectively a modulo operation.// 取模 (正数与取余一样,负数)int bloomPos = hash & bloomSize;filter.set(bloomPos);} 
  • 通过MurMurHash2生成一个int的Hash编码
  • 对BloomSize(预设的文档的数量)进行取余操作
  • filter调用add方法添加value
    整体的数据流转如下:
    在这里插入图片描述

存在的问题

生命周期

目前es主要在uid上字段上维护布隆过滤器,主要用于判定文档是否存在:

  • 数据写入时:判断是否存在
  • 数据查询时:判断id文档是否存在

创建时期:构建IndexReader时,从b1m文件中加载bit数组到内存
回收时期:在IndexReader.close内存的bit数组进行gc回收
merge:因为每个seg的bit信息时独立的因此在merge时,会读取bit信息并进行merge

对GC的影响

实验表明1亿的文档通常情况下会占用120mb左右的内存,同时会对GC产生如下影响:

  1. 小文件产生的内存碎片
  2. 大文件触发GC

这篇关于Lucene随笔-BoomFilter布隆过滤器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076022

相关文章

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

布隆过滤器的详解与应用

一、什么是Bloom Filter Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个位阵列(Bit array)中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检索元素一定不在;如果都是1,则被检索元素很可能在。这就是布隆过滤器的基本思

请解释Java Web应用中的前后端分离是什么?它有哪些好处?什么是Java Web中的Servlet过滤器?它有什么作用?

请解释Java Web应用中的前后端分离是什么?它有哪些好处? Java Web应用中的前后端分离 在Java Web应用中,前后端分离是一种开发模式,它将传统Web开发中紧密耦合的前端(用户界面)和后端(服务器端逻辑)代码进行分离,使得它们能够独立开发、测试、部署和维护。在这种模式下,前端通常通过HTTP请求与后端进行数据交换,后端则负责业务逻辑处理、数据库交互以及向前端提供RESTful

.NET 自定义过滤器 - ActionFilterAttribute

这个代码片段定义了一个自定义的 ASP.NET Core 过滤器(GuardModelStateAttribute),用于在控制器动作执行之前验证模型状态(ModelState)。如果模型状态无效,则构造一个 ProblemDetails 对象来描述错误,并返回一个 BadRequest 响应。 代码片段: /// <summary>/// 验证 ModelState 是否有效/// </

水处理过滤器运行特性及选择原则浅谈

过滤属于流体的净化过程中不可缺的处理环节,主要用于去除流体中的颗粒物或其他悬浮物。水处理过滤器的原理是利用有孔介质,从流体中去除污染物,使流体达到所需的洁净度水平。         水处理过滤器的滤壁是有一定厚度的,也就是说过滤器材具有深度,以“弯曲通 道”的形式对去除污染物起到了辅助作用。过滤器是除去液体中少量固体颗粒的设备,当流体进入置有一定规格滤网的滤筒后,其杂质被阻挡,而

过滤器:精密过滤器特点及应用范围概述

精密过滤器(又称作保安过滤器),筒体外壳一般采用不锈钢材质制造,内部采用PP熔喷、线烧、折叠、钛滤芯、活性炭滤芯等管状滤芯作为过滤元件,根据不同的过滤介质及设计工艺选择不同的过滤元件,以达到出水水质的要求。随着过滤行业的不断发展,越来越多的行业和企业运用到了精密过滤器,越来越多的企业加入了精密过滤器行业。   一、精密过滤器的性能特点及应用   1、精密过滤器的性能特点   (1)过滤精

过滤器:自清洗过滤器工作原理及特点阐述

一、自清洗过滤器的原理描述   当水从进水口进入并从外向里进入粗滤网(粗滤网的设置根据水质情况而定),较粗的杂质被过滤后再进入细滤网,较小的杂质被拦截在细过滤内壁,过滤后的干净水从出水口流出,当滤筒内壁的杂质越积越多时,自清洗过滤器进出口的压差达到预设值或达到清洗时间或手动预制时,过滤器将开始自清洗过程,整个自清洗过程包含两个步骤:打开位于自清洗过滤器上的自动排污阀;外部的双向电机带动吸吮扫

过滤器:活性碳过滤器技术特点简要分析

活性碳过滤器是一种罐体的机械过滤器,外壳一般为不锈钢或者玻璃钢,内部填充活性炭,用来过滤水中的游离物、微生物、部分重金属离子,并能有效降低水的色度。活性炭过滤器是一种较常用的水处理设备,作为水处理脱盐系统前处理能够吸附前级过滤中无法去除的余氯,可有效保证后级设备使用寿命,提高出水水质,防止污染,特别是防止后级反渗透膜,离子交换树脂等的游离态余氧中毒污染。同时还吸附从前级泄漏过来的小分子有机物等

过滤器:自清洗过滤器工作原理及技术特点阐述

一、自清洗过滤器的原理描述   当水从进水口进入并从外向里进入粗滤网(粗滤网的设置根据水质情况而定),较粗的杂质被过滤后再进入细滤网,较小的杂质被拦截在细过滤内壁,过滤后的干净水从出水口流出,当滤筒内壁的杂质越积越多时,自清洗过滤器进出口的压差达到预设值或达到清洗时间或手动预制时,过滤器将开始自清洗过程,整个自清洗过程包含两个步骤:打开位于自清洗过滤器上的自动排污阀;外部的双向电机带动吸吮扫

过滤器:自清洗过滤器适用范围详细说明

利用滤网拦截水中的杂质,去除水中的悬浮物、颗粒物,以净化水质、降低浊度、净化水质以及保护系统其他设备正常工作的一类精密设备被称为高效自清洗过滤器,以下是对该过滤器特点的介绍。   高效自清洗过滤器特点   1、自清洗过滤器体积小。   该过滤器反冲吸盘和过滤芯分装在两个仓内。中间用隔板将其隔开,一目了然。同时吸盘紧靠在光滑的隔板上,这样减少了吸盘的磨损,因而机构可靠耐用。   2、自清