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