basic definitions
- doc: Seq[Field]
- field: NamedSeq[Term]
- term: Seq[Byte]
在不同field中的相同bytes, 被視為不同的term.So, term is represented as: field_name + field_value
索引
因?yàn)榉衷~成term(s), 所以Lucene是term-based搜索, 如何分詞影響到了search的效率和準(zhǔn)確(結(jié)果)
field的類型
field可以被直接存儲(chǔ), 即它們的原文(text of a field)可以被直接存儲(chǔ)stored, 也可以被倒排(tokeniezd into term)為索引indexed , 或者同時(shí)存在.
另外, 可以被tokenized為多個(gè)terms, 某些情況下也可以字面量的直接作為一個(gè)term.
更多信息可以org.apache.lucene.document.Field
segments段
indexs is composed of multi sub-indexes, called segments.每個(gè)段,都是一個(gè)完全獨(dú)立的index, 可以被單獨(dú)的搜索, 索引包括:
- 為新加的文檔創(chuàng)建新的segments
- merge已存在的segments
doc numbers
doc numbers是段內(nèi)unique的, 不是全局, 在更大范圍內(nèi)使用的時(shí)候需要被轉(zhuǎn)化為更大范圍的情況.標(biāo)準(zhǔn)技術(shù)是給每個(gè)段一個(gè)范圍的值, 當(dāng)需要轉(zhuǎn)化的時(shí)候,要使用到這個(gè)segment的base值, 當(dāng)從外部轉(zhuǎn)化為段內(nèi)序號(hào)的時(shí)候, 首先利用range判斷到哪個(gè)段內(nèi), 然后減去base值.
在doc被刪除的時(shí)候, 序號(hào)列表會(huì)出現(xiàn)空洞, 當(dāng)然最終在merge后,空洞被移除.
索引結(jié)構(gòu)
每個(gè)seg都包含以下信息
segment info: .si : metadata about a segment, such as member of docs, 使用占據(jù)了那些文件, seg是怎么被存儲(chǔ)的相關(guān)信息.
field names: .fnm : field names, 這個(gè)field在所所有fields中的排列序號(hào), 還包含著這個(gè)field的索引的選項(xiàng), DocValue的信息, field選項(xiàng): 是否有term vectors, 是否norms, 是否有payload.
-
stored field values: * org.apache.lucene.codecs.StoredFieldsFormat
- fields data file: .fdt : 將docs以16kb的塊壓縮存儲(chǔ), 每當(dāng)內(nèi)存中超過16kb, 寫入disk, LZ4的方式壓縮....一些特殊情況, 看文檔
- fields index file: .fdx : 包含兩個(gè)單調(diào)數(shù)組, 當(dāng)search的時(shí)候, 從第一個(gè)數(shù)組中找到對(duì)應(yīng)的docId所在的塊,然后找到docId, 再從第二個(gè)數(shù)組中找到磁盤上的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的列表, 且每個(gè)term的統(tǒng)計(jì)信息(docFreq, etc), 以及指向?qū)?yīng)term的freq, positions, payload 和 skip data 的存儲(chǔ)文件: .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的實(shí)現(xiàn)?
-
norms data:
- norms data: .nvd: norms data, 對(duì)么個(gè)norms的field, 存儲(chǔ)實(shí)際的數(shù)據(jù),整個(gè)每個(gè)文檔
- norms metadata: .nvm: norms metadata, 對(duì)每個(gè)norms的field, 存儲(chǔ)metadata, 比如在norms data中的offset
-
term vectors: 對(duì)每個(gè)doc的每個(gè)field, 如果存儲(chǔ)了, 它包含著term的text和term的freq
- a vector data file: .tvd: 存儲(chǔ)每個(gè)文檔的terms, freqs, positions, offsets and payloads
- An index file : .tvx:
Per-document values: 實(shí)現(xiàn)DocValue的....https://www.elastic.co/cn/blog/sparse-versus-dense-document-values-with-apache-lucene
live documents: .liv: 可選的, 只有在seg中存在刪除文檔時(shí)候,存在這個(gè)文件, per-seg.
point value: .kdi, .kdm: 將緯度信息encode進(jìn)入BKD-tree
索引選項(xiàng):
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