lucene5.0--源码
lucene
車輪の唄
atarik@163.com
展开
-
lucene倒排表在内存中的缓存结构1--ByteBlockPool,IntBlockPool,ParallelPostingsArray,BytesRefHash
Lucene设计了一系列内存高效的数据结构,通过对象复用和内存分页的思想,来优化Java GC问题。这部分内容将围绕ByteBlockPool, IntBlockPool,ParallelPostingsArray, BytesRefHash展开ByteBlockPool,IntBlockPoolByteBlockPool是Lucene实现高效的可变长的基本类型数组,但实际上...原创 2019-03-21 19:35:38 · 1195 阅读 · 0 评论 -
Lucene的Vint类型压缩
1.vint,vlong是什么lucene实现了可变长度int,使用1-5个字节存放一个int类型的数据,正常的int类型是4个字节,2.vint,vlong策略Vint压缩策略是,用每个字节的最高位做标志位,后7位为有效算术位,如果标志位为1,则说明后一个字节和当前字节是同一个数字,为0说明后一个字节是一个新的数字说明: 大致理解是VINT每个字节8位,第一位表示后面的字节是否属...原创 2018-07-30 21:32:09 · 747 阅读 · 0 评论 -
Lucene排序取TopN源码分析--PriorityQueue
PriorityQueue 实现一优先队列框架,实例非常简单,只需实现lessThan(Object a, Object b)方法即可,通过该方法可以控制大优先或小优先通过分析lucene源码可知,lucene每命中一个结果,就调用一次collector.collect(doc)方法,由Collector把结果保存到一个PriorityQueue中。对于常见的取TopN的情况,通常实例化一个...原创 2018-06-10 18:55:06 · 832 阅读 · 0 评论 -
Lucene二阶段提交
IndexWirter继承了TwoPhaseCommit接口,实现三个方法:prepareCommit,commit与rollbackprepareCommit,完成二阶段提交第一阶段的工作,它会尽可能多的完成更新工作,但又避免完成真实的提交。你可以轻松地利用rollback废弃掉当前阶段完成的所有工作。 事实上本次commit所产生的段文件,已写入存储。 commit方法是完成第二阶段的工...原创 2019-04-10 19:02:05 · 476 阅读 · 0 评论 -
IndexDeletionPolicy以及多次commit
关于索引删除的策略IndexDeletionPolicyIndexDeletionPolicy是一个接口,是有关在建立索引的过程中,对索引文件进行灵活地(删除)操作的一种自定义接口。可以在合适的时机进行删除操作,可以指定删除的时刻,完全可以根据自己的需要进行定制,但是,这可能会造成存储开销,但是相对于删除操作策略的灵活便利性,这也是比较值得的。IndexDeletionPolicy接口的定...原创 2019-04-10 21:45:57 · 418 阅读 · 0 评论 -
索引整体架构
Lucene将索引文档的过程设计成两个阶段,写入内存阶段和写入硬盘阶段。在写入内存阶段,Lucene通过IndexChain把document分解并把相关信息存储到内存中,等到满足flush条件(内存容量或者文档个数积累到临界值),就通过IndexChain把内存中的数据写入硬盘。IndexChain是Lucene索引文档很重要的一部分,那么IndexChain是什么呢Lucene形成索引的过...原创 2018-05-06 11:27:52 · 425 阅读 · 0 评论 -
多个MUST的倒排表合并
SkipList本质上是在有序的链表上实现实现二分查找,它能有效的提升链表的查找效率,其时间复杂度为O(logn)(其中n为链表长度)。简单说SkipList优化了Postings的随机查找的性能问题。SkipList的节点存储了三部分数据,分别是当前节点指向Block的信息,是关于Block本身的信息;指向下层的索引;最后是存储freq和norm的信息,它被封装在Impact里面。Im...原创 2019-03-29 18:37:25 · 498 阅读 · 1 评论 -
多个SHOULD的倒排表合并
BooleanScorer中的一些变量跟方法staticfinalintSHIFT=11;staticfinalintSIZE=1<<SHIFT;staticfinalintSET_SIZE=1<<(SHIFT-6);staticclassBucket{ // 谋篇文档的分数 doublescore;...原创 2019-03-29 17:46:15 · 273 阅读 · 0 评论 -
Lucene倒排索引原理与实现:Term Dictionary和Index文件 (FST详细解析)
有限自动机算法(FST,Finite State Transducer):通过输入有序字符串构建最小有向无环图。通过共享前缀来节省空间,内存存放前缀索引,磁盘存放后缀词块1、紧凑的结构,通过对词典中单词前缀和后缀的重复利用,压缩了存储空间。2、O(len(str))的查询时间复杂度。lucene使用fst, 最主要的是解决了模糊搜索的问题注:该过程是执行flush动作...原创 2017-12-20 10:45:05 · 3200 阅读 · 1 评论 -
lucene倒排表在内存中的缓存结构2--一个demo
跟进TermHashPerField里面的add()方法,新增term为term即将存储的[docId,freq]信息、posi等信息,在bytePool中申请slice(内存空间),并将对应的slice起始位置作为[docId,freq]和posi等信息的结束位置写入intPool(由于还没存入信息,所以用起始位置作为结束位置),两个信息在bytePool中分别存在独立的slice中。...原创 2019-03-22 09:40:46 · 306 阅读 · 0 评论 -
lucene数值类型的索引和范围查询分析
Query q = NumericRangeQuery.newLongRange("idField", 1L, 10L, true, true);对数值类型建索引的时候,会把数值转换成多个lexicographic sortable string ,然后索引成trie字典树结构。例如:假设num1 拆解成 a ,ab,abc ;num2 拆解成 a,ab,abd 。【图1】:...原创 2019-05-28 18:08:10 · 1101 阅读 · 0 评论