Lucene包解读之util,store

ARM 汇编指令:LSL(逻辑左移) 和 LSR(逻辑右移) ARM 汇编中的 LSL(逻辑左移)和 LSR(逻辑右移)是基础移位指令,分别实现二进制位的左移和右移操作。LSL 低位补0,等效于乘以2^n;LSR 高位补0,等效于无符号除以2^n。这两个指令可以单独使用或与其他指令结合(如ADD、MOV等),利用ARM的"桶形移位器"硬件实现高效运算。关键特性括:移位范围0-31(LSL)或1-32(LSR),可选更新标志位,以及与其他指令结合时的无额外开销优势。LSR与ASR(算术右移)的主要区别在于高位填充方式,分别适用于无符号和有符号数处理 阅读详情

校内搜索的底层索引我是用它做的,为什么速度这么快腻,以前只是用它的查询接口,没有深入到核心去看它的索引文件结构,今天分析了以下它的源代码主要是store包和util包这两个与文件最为密切的包。

包org/apache/lucene/util包含一些数据结构如BitVector 和PriorityQueue,还有StringHelper类主要的用途是判断两个字符串是否相等。

抽象类PriorityQueue是一个优先队列的抽象类,用于后面实现各种具体的优先队列,提供常数时间内的最小元素访问能力,内部实现机制是哈希表和堆排序算法。

Constants主要定义了一些全局的常量。用System.getProperty("java.version"),System.getProperty("os.name")获得Java版本,系统的版本号。

 包org/apache/lucene/store里主要是一些对文件的操作类。其主要目的是抽象出和平台文件系统无关的存储抽象,提供诸如目录服务(增、删文件)、输入流和输出流。

主要的类的结构为:抽象类Directory类,InputStream类和OutputStream类。

其中FSDirectory,RAMDirectory继承了Directory抽象类,

FSInputStream,RAMInputStream继承了InputStream抽象类,

FSOutputStream,RAMOutputStream继承了OutputStream抽象类。

其中FS开头的是以实际的文件系统为基础的,以RAM开头的是内存中的虚拟文件系统,虚拟文件的类为:RAMFile,包含的内容为:

  Vector buffers = new Vector();

  long length;

  long lastModified = System.currentTimeMillis();

RAMFile中采用数组来表示文件的存储空间。在此的基础上,完成各项操作的实现,就形成了基于内存的虚拟文件系统。
下面具体分析这个内存的虚拟文件系统。
RAMDirectory类中:files信息存在一个Hashtable里

Hashtable files = new Hashtable();

创造文件的函数为

public final OutputStream createFile(String name)

{

    RAMFile file = new RAMFile();

    files.put(name, file);

    return new RAMOutputStream(file);

}

即将name 和RAMFile存到一个Hashtable中。

打开内存文件的方式为:

public final InputStream openFile(String name)

 {

    RAMFile file = (RAMFile)files.get(name);

    return new RAMInputStream(file);

  }

其实就是用一个Hashtable来在内存中形成一个文件系统。

再来看看RAMInputStream,继承了InputStream类的方法,并重写了readInternal和

seekInternal方法。

构造函数

public RAMInputStream(RAMFile f)

{

    file = f;

    length = file.length;

}很容易理解。

这里大量用到了抽象类InputStream的方法,先从Lucene自定义的数据类型看,

Lucene定义一个Buffer_Size的长度为1024,并定义一bufferPosition指向其在缓冲区的位置。以下是4种数据类型基本的。

数据类型一:Int表示读取4个字节的int类型。

在InputStream中:

public final int readInt() throws IOException {

    return ((readByte() & 0xFF) < < 24) | ((readByte() & 0xFF) << 16)

         | ((readByte() & 0xFF) <<  8) |  (readByte() & 0xFF);

  }

其中readByte()函数为:

public final byte readByte() throws IOException

{

    if (bufferPosition >= bufferLength)

      refill();

    return buffer[bufferPosition++];

  }

数据类型二:VInt, 可变长度的整数,最小一个字节,可以是2-4个字节,如果一个字节表示不了的话。不过通常是一个字节就够了。

以下是读取Vint的函数读取2个或3个或4个字节。

public final int readVInt() throws IOException {

    byte b = readByte();

    int i = b & 0x7F;

    for (int shift = 7; (b & 0x80) != 0; shift += 7) {

      b = readByte();

      i |= (b & 0x7F) < < shift;

    }

    return i;

  }

数据类型三:Vlong,可变长度的长整数,最小一个字节,可以是2-8个字节,如果一个字节表示不了的话。不过通常是一个字节就够了。

public final long readVLong() throws IOException {

    byte b = readByte();

    long i = b & 0x7F;

    for (int shift = 7; (b & 0x80) != 0; shift += 7) {

      b = readByte();

      i |= (b & 0x7FL) << shift;

    }

    return i;

  }

数据类型四:Long,读取8个字节的数据,

public final long readVLong() throws IOException {

    byte b = readByte();

    long i = b & 0x7F;

    for (int shift = 7; (b & 0x80) != 0; shift += 7) {

      b = readByte();

      i |= (b & 0x7FL) << shift;

    }

    return i;

  }

数据类型五:VString,java中的字符串是没有像C里面一样的’/0’的结束符的,所以在文件中记录一个字符串时,在字符串前放一个VInt表示字符串的长度。

private char[] chars;

public final String readString() throws IOException {

    int length = readVInt();

    if (chars == null || length > chars.length)

      chars = new char[length];

    readChars(chars, 0, length);

    return new String(chars, 0, length);

  }

ReadChars函数为

public final void readChars(char[] buffer, int start, int length)

       throws IOException {

    final int end = start + length;

    for (int i = start; i < end; i++) {

      byte b = readByte();

      if ((b & 0x80) == 0)

       buffer[i] = (char)(b & 0x7F);

      else if ((b & 0xE0) != 0xE0) {

       buffer[i] = (char)(((b & 0x1F) << 6)

               | (readByte() & 0x3F));

      } else

       buffer[i] = (char)(((b & 0x0F) << 12)

              | ((readByte() & 0x3F) << 6)

               |  (readByte() & 0x3F));

    }

  }

主要功能是读取一段长度的数据转换为String类型

HLA分型 HLA分型 一、根据WES的tumor数据进行数据分型 选用hlahd 软件安装及使用 [root@18605fd8771e ~]# wget https://jaist.dl.sourceforge.net/project/bowtie-bio/bowtie2/2.4.1/bowtie2-2.4.1-linux-x86_64.zip [root@18605fd8771e ~]# unzip bowtie2-2.4.1-linux-x86_64.zip && mv bowtie2-2.4.1 阅读详情

相关推荐

lucene-memory-3.5.0.jar lucene

lucene-memory-3.5.0.jar lucene

Lucene的全文检索算法

1. 什么是lucenelucene是apache组织下的一个全文检索引擎工具, 就是一堆jar, 放入tomcat下不可以独立运行.2. lucene的作用?优化查询速度, 在海量数据查询的时候, 可以优化查询速度 我们可以使用lucene来构建像百度, 谷歌, 必应这样的全文检索引擎系统3. 应用领域:互联网全文检索引擎: 百度, 谷歌, 必应 站内全文检索引擎: 天猫, 京东的搜索

没有伞的孩子必须努力奔跑!—小林 2852

luceneutil:各种实用程序脚本,用于运行Lucene性能测试

LuceneutilLucene基准测试实用程序 设置luceneutil 首先,选择一个根目录,在该目录下将检出luceneutil,存在数据集,建立索引,检出Lucene源代码等。在此,我们将该目录称为$LUCENE_BENCH_HOME 。 # 1. checkout luceneutil: # Choose a suitable directory, e.g. ~/Projects/lucence/benchmarks. mkdir $LUCENE_BENCH_HOME && cd $LUCENE_BENCH_HOME git clone https://github.com/mikemccand/luceneutil.git util # 2. Run the setup script cd util python src/python/setup.py -download

Java框架------Lucene(一)

一、Lucene介绍 1.1功能介绍 Lucene是apache下的一个开源的全文检索引擎工具。 全文检索就是先分词创建索引,再执行搜索的过程。 分词:就是将一段文字分成一个个单词 全文检索就将一段文字分成一个个单词去查询数据!!! 1.2Lucene实现全文检索的流程 全...

chufengmiaon4690的博客 197

lucene.net索引文件存储简析

lucene.net中,典型的索引文件操作代码如下: IndexWriter writer = new IndexWriter("c:\index", new StandardAnalyzer(), true); try { Document doc = new Document(); doc.Add(Field.Keyword("name", "name name")...

weixin_30399821的博客 150

es启动时:无法访问org.apache.lucene.util.Version

添加此依赖,版本号和org.elasticsearch.client的版本一致 <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.15.2</version> </dependency> ...

tmd 2652

lucene 中关于Store.YES 关于Store.NO的解释

总算搞明白 lucene 中关于Store.YES  关于Store.NO的解释了   一直对Lucene Store.YES不太理解,网上多数的说法是存储字段,NO为不存储。 这样的解释有点郁闷:字面意思一看就明白,但是不解。 之前我的理解是:如果字段可以不存储,那要怎么搜索这个不存储的字段呢? 原来Lucene就是这样,可以设置某些字段为不存储,但是可以用来检索。 终于在一篇文...

weixin_34318956的博客 397

Lucene-2.2.0 源代码阅读学习(39)

关于Lucene得分的计算。 在IndexSearcher类中有一个管理Lucene得分情况的方法,如下所示: public Explanation explain(Weight weight, int doc) throws IOException {    return weight.explain(reader, doc);} 返回的这个Explanation的实例解释了Lucene中Doc...

pavel0的专栏 233

vue项目中,前端工程化、模块化、组件化 & 文件夹的释义——utils、tools、store-module和modules

vue项目中,前端工程化、模块化、组件化 & 文件夹的释义——utils、tools、store-module和modules 好的代码像粥一样,都是用时间熬出来的 前端工程化 工程化是一种思想而不是某种技术(当然为了实现工程化我们会用一些技术) 前端工程化就是用做工程的思维看待和开发自己的项目,而不再是直接撸起袖子一个页面一个页面开写。 前端模块化 前端工程化是一个高层次的思想,而模块化和组件化是为工程化思想下相对较具体的开发方式,因此可以简单的认为模块化和组件化是工程化的表现形式。 模块

weixin_44867717的博客 2577

前端实用程序utils - 开发工作流(一)

写在前面 早年间有幸在Raychee哥门下当小弟,学到两把刷子。在编程路上,他的很多思想深深影响了我,比如笔者今天要分享的主题。在程序开发中,有个utils,叫做实用程序,程序员们会把项目中通用的东西抽离出来放到这个里面,这有利于项目工程化的落地,提高项目的可维护性,减少代码冗余,锻炼编码能力,提高编码效率,理解编程思想。 在开始之前,我们先思考下,创建一个规范的项目我们需要关注哪些点?我觉...

岩家兴的博客 1195

Lucene中Directory

MMapDirectory继承自FSDirectory,针对jre至今没解决的Mmap close不回收空间(直至full gc才回收)的bug,lucene用hack方式回收(仅对sun jam)(线上目前还是出现这个问题,是什么情况,得确认一下)。其中64位linux下chunk是1G,MMAP之后返回ByteBuffer数组,其IndexInput类是MMapIndexInput。 FSD

jollyjumper的专栏 3942

异常——org.apache.lucene.util.SetOnce$AlreadySetException

异常介绍 SetOnce A convenient class which offers asemi-immutable objectwrapper implementation which allows one to set the value of an object exactly once, and retrieve it many times. 用来封装对象的一个类,只能赋值一...

weixin_30497527的博客 445

Lucene深入学习(9)Lucene的索引方式Directory

Tips 示例代码基于Lucene 6.2.1.Directory创建索引时,必须要用到,而它只有一个构造函数: public IndexWriter(Directory d, IndexWriterConfig conf) 这里的Directory是必须的。Directory是Lucene内部自定义的目录类型,它本身是一个抽象类,在Lucene自带的工具中,Directory有两个子类,分别

随-记的专栏 2420

餐中餐(2)Lucene--核心类IndexWriter(Part 1)

文章目录1.设置索引目录Directory1.1DirectoryBaseDirectory类FSDirectory类SimpleFSDirectory使用SimpleFSDirectory有以下注意点:NIOFSDirectory使用NIOFSDirectory有以下注意点:MMapDirectory如何选择FSDirectoryByteBuffersDirectoryRAMDirectoryFilterDirectorySleepingLockWrapperTrackingTmpOutputDirect

Cherish__it的博客 789

ElasticSearch启动错误锦集

1.Exception in thread "main" java.lang.UnsupportedClassVersionError: org/elasticsearch/common/transport/TransportAddress : Unsupported major.minor version 52.0 /Library/Java/JavaVirtualMachines/jdk1...

king的专栏 3万+

lucene遇到的错误

1、遇到的错误:    1.1:org.apache.lucene.util.SetOnce$AlreadySetException: The object cannot be set twice!           错误原因:* 使用同一 indexWriterConfig 两次    1.2:org.apache.lucene.store.LockObtainFailedExcepti

Mooner_guo的专栏 1666

探索搜索引擎新境界:Luceneutil - 超级优化工具

探索搜索引擎新境界:Luceneutil - 超级优化工具 在信息爆炸的时代,搜索引擎已经成为我们日常生活和工作中不可或缺的一部分。Apache Lucene作为一个强大的全文检索库,为开发者提供了构建高效搜索引擎的基石。然而,如何让这个基石更上一层楼呢?这就是Luceneutil出现的目的——一个专为Lucene打造的基准测试工具,让你轻松挖掘出更高的性能潜力。 Luceneutil:一窥究竟...

gitblog_00032的博客 370

luceneByteBuffersIndexInput

ByteBuffersIndexInput` 是 Lucene 中专门为 `ByteBuffersDirectory` 实现的一个 `IndexInput` 子类,用于高效地从 **内存中的 `ByteBuffer` 数组** 读取数据。| **零拷贝** | 使用 `ByteBuffer.duplicate()` 和 `slice()` 实现高效切片。| **支持随机访问** | 直接通过 `ByteBuffer` 索引定位,无需 `seek()` 系统调用。### ✅ **示例**

risc123456的博客 500

lucene索引的增删改查

转载自:http://499316246-qq-com.iteye.com/blog/2036805 Lucene2--索引的增删改查 博客分类:  lucene lucene  1.全文检索系统的结构    2.Lucene倒排索引原理  假设有两篇文章1和2  文章1的内容为:Tom lives in Guangzhou,I live in Guangzh

lkx94的专栏 689

MAX 10 FPGA芯片用户手册设计导航用户指南等18个文档资料合集.zip

MAX 10 FPGA芯片用户手册设计导航用户指南等18个文档资料合集:MAX 10 Embedded Memory User Guide.pdfMAX 10 External Memory Interface User Guide.pdfMAX 10 FPGA Configuration User Guide.pdfMAX 10 FPGA Design Guidelines.pdfMAX 10 FPGA Device Architecture.pdfMAX 10 FPGA Signal Integrity Design Guidelines.pdfMAX 10 FPGA器件体系结构.pdfMAX 10 FPGA器件数据表.pdfMAX 10 FPGA器件概述.pdfMAX 10 JTAG边界扫描测试用户指南.pdfMAX 10 User Flash Memory User Guide.pdfMAX 10 嵌入式乘法器用户指南.pdfMAX 10 模数转换器用户指南.pdfMAX 10 通用IO用户指南.pdfMAX 10 高速LVDS IO 用户指南.pdfMAX 10时钟和PLL用户指南.pdfMAX10 功耗管理用户指南.pdf

上一篇: JavaScript常用代码集锦
下一篇: 那些人不适合学习jsp
redez
博客等级 码龄23年 2粉丝 29原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值