笔记
文章平均质量分 51
山坡程序废物
这个作者很懒,什么都没留下…
展开
-
lucene代码分析13
2021SC@SDUSC写入索引域代码为:DocInverter.flush(Map<DocFieldConsumerPerThread,Collection>,SegmentWriteState)//写入倒排表及词向量信息–> consumer(TermsHash).flush(childThreadsAndFields, state);//写入标准化因子–> endConsumer(NormsWriter).flush(endChildThreadsAndFiel原创 2021-12-27 03:19:47 · 71 阅读 · 0 评论 -
lucene代码分析12
2021SC@SDUSC按照基本索引链的结构将索引结果写入段代码为:consumer(DocFieldProcessor).flush(threads, flushState);//回收 fieldHash,以便用于下一轮的索引,为提高效率,索引链中的对象是被复用的。Map<DocFieldConsumerPerThread, Collection>childThreadsAndFields = new HashMap<DocFieldConsumerPerThread,Co原创 2021-12-27 03:17:36 · 65 阅读 · 0 评论 -
lucene代码分析11
2021SC@SDUSC按照基本索引链关闭存储域和词向量信息代码为:closeDocStore();flushState.numDocsInStore = 0;其主要是根据基本索引链结构,关闭存储域和词向量信息:consumer(DocFieldProcessor).closeDocStore(flushState);consumer(DocInverter).closeDocStore(state);consumer(TermsHash).closeDocStore(state);原创 2021-12-27 03:15:05 · 201 阅读 · 0 评论 -
lucene代码分析10
2021SC@SDUSC得到要写入的段名代码:SegmentInfo newSegment = null;final int numDocs = docWriter.getNumDocsInRAM();//文档总数String docStoreSegment = docWriter.getDocStoreSegment();//存储域和词向量所要要写入的段名,"_0"int docStoreOffset = docWriter.getDocStoreOffset();//存储域和词向量要写入的原创 2021-12-27 03:12:32 · 182 阅读 · 0 评论 -
lucene代码分析9
2021SC@SDUSC跳跃表规则(Skip list)为了提高查找的性能,Lucene 在很多地方采取的跳跃表的数据结构。跳跃表(Skip List)是如图的一种数据结构,有以下几个基本特征: 元素是按顺序排列的,在 Lucene 中,或是按字典顺序排列,或是按从小到大顺序排列。跳跃是有间隔的(Interval),也即每次跳跃的元素数,间隔是事先配置好的,如图跳跃表的间隔为 3。 跳跃表是由层次的(level),每一层的每隔指定间隔的元素构成上一层,如图跳跃表共有2 层。需要注意一原创 2021-12-27 03:09:34 · 258 阅读 · 0 评论 -
lucene分析8
2021SC@SDUSC或然跟随规则Lucene 的索引结构中存在这样的情况,某个值 A 后面可能存在某个值 B,也可能不存在,需要一个标志来表示后面是否跟随着 B。一般的情况下,在 A 后面放置一个 Byte,为 0 则后面不存在 B,为 1 则后面存在 B,或者 0则后面存在 B,1 则后面不存在 B。但这样要浪费一个 Byte 的空间,其实一个 Bit 就可以了。在 Lucene 中,采取以下的方式:A 的值左移一位,空出最后一位,作为标志位,来表示后面是否跟随 B,所以在这种情况下,原创 2021-12-27 03:07:52 · 236 阅读 · 0 评论 -
lucene7
2021SC@SDUSC然而当我们要打开一个索引的时候,我们必须要选择一个来打开。Lucene 采取以下过程:其 一 , 在 所 有 的 segments_N 中 选 择 N 最 大 的 一 个 。 基 本 逻 辑 参 照SegmentInfos.getCurrentSegmentGeneration(File[] files) , 其 基 本 思 路 就 是 在 所 有 以segments 开头,并且不是 segments.gen 的文件中,选择 N 最大的一个作为 genA。其二,打开 se原创 2021-12-10 08:31:13 · 75 阅读 · 0 评论 -
lucene分析7
一个索引(Index)可以同时存在多个 segments_N(至于如何存在多个 segments_N,在描述完详细信息之后会举例说明),然而当我们要打开一个索引的时候,我们必须要选择一个来打开。Lucene 采取以下过程: 其 一 , 在 所 有 的 segments_N 中 选 择 N 最 大 的 一 个 。 基 本 逻 辑 参 照SegmentInfos.getCurrentSegmentGeneration(File[] files) , 其 基 本 思 路 就 是 在 所 有 以segmen原创 2021-12-10 02:11:11 · 172 阅读 · 0 评论 -
lucene分析6
2021SC@SDUSClucene索引结构是有层次结构的,具体如下:(1)索引 : 索引全部是是放在同一个文件夹中,这些内容构成了一个完整的lucene索引(2)段(segment):一个索引可以包括很多段,段与段之间是独立的,新添加新文档可以生成新的段,段与段可以合并具有相同前缀文件的属于同一段,如图中共两个段"_0","_1";segments.gen 和 segment_5是段的数据文件,也即它们保存了段的属性信息(3)文档(document):文档是建立索引的基本单位,不同的文档保存原创 2021-12-10 02:00:21 · 75 阅读 · 0 评论 -
lucene代码分析6
2021SC@Slucene索引结构是有层次结构的,具体如下:(1)索引 : 索引全部是是放在同一个文件夹中,这些内容构成了一个完整的lucene索引(2)段(segment):一个索引可以包括很多段,段与段之间是独立的,新添加新文档可以生成新的段,段与段可以合并具有相同前缀文件的属于同一段,如图中共两个段"_0","_1";segments.gen 和 segment_5是段的数据文件,也即它们保存了段的属性信息(3)文档(document):文档是建立索引的基本单位,不同的文档保存在不同的段中,一个原创 2021-12-11 23:25:36 · 61 阅读 · 0 评论 -
lucene代码分析5
2021SC@SDUSClucene调用链自上而下,大概可以分三层, 前四个步骤是逻辑调用层,IndexWriter类将整个Document作为参数调用addDocument方法, IndexWriter下的DocWriter再调用对应的updateDocument去更新文档,最后从线程池种拉出一个DocWriterPerThread对象来执行最终的updateDocument逻辑,再这一层实际上并没有什么实质性地发生中间一层是索引链的处理逻辑,DefaultIndexingChain是一个非常核心的原创 2021-11-29 03:53:25 · 133 阅读 · 0 评论 -
lucene代码分析4
Lucene作为一个检索引擎主要保存七种类型的数据: PostingList,TermDict,StoredField ,DocValue, TermVector, Norms,PointValue, 前四种是所有检索引擎都会保存的数据,后三种是Lucene特有的数据,实际上,StoredField就是我们所说的正排数据,它是一种行式存储,类似于mysql中的行数据,StoredField承担存储最原始的数据的角色重要性不言而喻,之所以先讲这块也是因为它最简单,但是在讲StoredField的时候会包含很多原创 2021-11-29 03:51:20 · 162 阅读 · 0 评论 -
lucene代码分析
2021SC@SDUSClucene读取过程Analyzer analyzer = new StandardAnalyzer(); // Store the index in memory: Directory directory = new RAMDirectory(); // To store an index on disk, use this instead: //Directory directory = FSDirectory.open("/tmp/test原创 2021-11-09 14:42:49 · 104 阅读 · 0 评论