Lucene源码分析 - CompressingStoredFieldsWriter 文档列写入

本文的代码以lucene-core 6.3.0为准,包含CompressingStoredFieldsWriter具体实现。转载请注明出处。

0 - 基本信息

   CompressingStoredFieldsWriter类是Lucene将每个Document的所有Field写入文件的具体实现类,在DefaultIndexingChain类中被调用,调用顺序是startDocument -> writeField -> finishDocument,过程比较简单。
   通过构造函数中可以了解到,Document需要存两部分数据,.fdt中存的是Document的每个Field的数据,.fdx存的是Document的索引数据。这里需要了解到的一个背景是,.fdx文件中,将16K(1 << 14)大小的或者数量为128的Document组成一个chunk,每个chunk是用LZ4函数压缩存储的。在整个.fdx中快速定位一个文档,需要先定位到文档的chunk位置,然后解压缩这个chunk的数据,最后找到文档在chunk中的位置才能找到文档的所有数据。
   在构造函数中fieldsStreamindexWriter分别可以写入.fdt和.fdx文件,了解背景,再看源码相对比较简单。

1 - CompressingStoredFieldsWriter 源码分析

   writeField函数实现了将一个Field的内容写入到内存中。

  public void writeField(FieldInfo info, IndexableField field)
      throws IOException {
   

    ++numStoredFieldsInDoc;

    int bits = 0;
    final BytesRef bytes;
    final String string;
	
	// 判断Field的类型,数字,字符串或者二进制,并计算长度
    Number number = field.numericValue();
    if (number != null) {
   
      if (number instanceof Byte || number instanceof Short || number instanceof Integer) {
   
        bits = NUMERIC_INT;
      } else if (number instanceof Long) {
   
        bits = NUMERIC_LONG;
      } else if (number instanceof Float) {
   
        bits = NUMERIC_FLOAT;
      } else if (number instanceof Double) {
   
        bits = NUMERIC_DOUBLE;
      } else {
   
        throw new IllegalArgumentException("cannot store numeric type " + number.getClass
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lucene是一个全文检索引擎,它的核心数据结构包括倒排索引和正排索引。其中,倒排索引是Lucene最重要的数据结构之一,它通过将文档中的每个词都映射到包含该词的文档表来实现快速的文本搜索。 Lucene中的Term Dictionary和Term Index是倒排索引中的两个重要组成部分。Term Dictionary用于存储所有唯一的词项(term),而Term Index则用于快速定位某个词项的位置。 在Lucene中,Term Dictionary和Term Index通常存储在磁盘上。Term Dictionary通常使用一种称为Trie树的数据结构来实现。Trie树是一种树形数据结构,它可以快速地查找某个字符串是否存在,以及在字符串集合中查找前缀匹配的字符串。 Term Index则通常存储在一个称为倒排索引表(Inverted Index Table)的结构中。倒排索引表是由一系的倒排索引条目(Inverted Index Entry)组成的,每个倒排索引条目包含了一个词项及其在倒排索引中的位置信息,例如该词项在文档表中出现的次数、该词项在哪些文档中出现等。 当进行文本搜索时,Lucene会首先在Term Dictionary中查找搜索关键词是否存在,然后通过Term Index快速定位到包含该词的文档表,最后根据文档表中的文档ID查找正排索引中具体的文档内容。这种基于倒排索引的搜索方式可以实现非常高效的文本搜索,是Lucene等全文检索引擎的核心技术之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值