lucene文件格式初探 (8.11)

https://lucene.apache.org/core/8_11_1/core/org/apache/lucene/codecs/lucene87/package-summary.html#package.description

basic definitions

  • doc: Seq[Field]
  • field: NamedSeq[Term]
  • term: Seq[Byte]

在不同field中的相同bytes, 被视为不同的term.So, term is represented as: field_name + field_value

索引

因为分词成term(s), 所以Lucene是term-based搜索, 如何分词影响到了search的效率和准确(结果)

field的类型

field可以被直接存储, 即它们的原文(text of a field)可以被直接存储stored, 也可以被倒排(tokeniezd into term)为索引indexed , 或者同时存在.
另外, 可以被tokenized为多个terms, 某些情况下也可以字面量的直接作为一个term.
更多信息可以org.apache.lucene.document.Field

segments段

indexs is composed of multi sub-indexes, called segments.每个段,都是一个完全独立的index, 可以被单独的搜索, 索引包括:

  • 为新加的文档创建新的segments
  • merge已存在的segments

doc numbers

doc numbers是段内unique的, 不是全局, 在更大范围内使用的时候需要被转化为更大范围的情况.标准技术是给每个段一个范围的值, 当需要转化的时候,要使用到这个segment的base值, 当从外部转化为段内序号的时候, 首先利用range判断到哪个段内, 然后减去base值.
在doc被删除的时候, 序号列表会出现空洞, 当然最终在merge后,空洞被移除.

索引结构

每个seg都包含以下信息

  • segment info: .si : metadata about a segment, such as member of docs, 使用占据了那些文件, seg是怎么被存储的相关信息.

  • field names: .fnm : field names, 这个field在所所有fields中的排列序号, 还包含着这个field的索引的选项, DocValue的信息, field选项: 是否有term vectors, 是否norms, 是否有payload.

  • stored field values: * org.apache.lucene.codecs.StoredFieldsFormat

    • fields data file: .fdt : 将docs以16kb的块压缩存储, 每当内存中超过16kb, 写入disk, LZ4的方式压缩....一些特殊情况, 看文档
    • fields index file: .fdx : 包含两个单调数组, 当search的时候, 从第一个数组中找到对应的docId所在的块,然后找到docId, 再从第二个数组中找到磁盘上的offset
    • fields meta file: .fdm: stores metadata about the monotonic arrays stored in the index file.
  • term dictionary:.tim 是term和postings的纽带文件:org.apache.lucene.codecs.PostingsFormat
    存着terms的列表, 且每个term的统计信息(docFreq, etc), 以及指向对应term的freq, positions, payload 和 skip data 的存储文件: .doc, .pos, .pay. 具体是由org.apache.lucene.codecs.FieldsConsumer的子类BlockTreeTermsWriter写入以encode postings in packed integer for fast decode.
    .tip: term index, 是tim dictionary 的索引文件

NOTE: The term dictionary can plug into different postings implementations: the postings writer/reader are actually responsible for encoding and decoding the PostingsHeader and TermMetadata sections described here:
是否意味着: 我们可以自己写读取postings的实现?

  • norms data:

    • norms data: .nvd: norms data, 对么个norms的field, 存储实际的数据,整个每个文档
    • norms metadata: .nvm: norms metadata, 对每个norms的field, 存储metadata, 比如在norms data中的offset
  • term vectors: 对每个doc的每个field, 如果存储了, 它包含着term的text和term的freq

    • a vector data file: .tvd: 存储每个文档的terms, freqs, positions, offsets and payloads
    • An index file : .tvx:
  • Per-document values: 实现DocValue的....https://www.elastic.co/cn/blog/sparse-versus-dense-document-values-with-apache-lucene

  • live documents: .liv: 可选的, 只有在seg中存在删除文档时候,存在这个文件, per-seg.

  • point value: .kdi, .kdm: 将纬度信息encode进入BKD-tree

索引选项:
0: not indexed
1: indexed as DOCS_ONLY
2: indexed as DOCS_AND_FREQS
3: indexed as DOCS_AND_FREQS_AND_POSITIONS
4: indexed as DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS

你可能感兴趣的:(lucene文件格式初探 (8.11))