lucene查詢索引的6個步驟
阿新 • • 發佈:2019-02-16
先準備資料來源,以兩個檔名字串做為值,儲存兩個document,如下圖:
然後以"path:txt"為查詢條件,來查詢索引檔案。我除錯發現會有6個步驟。資料主要來源於3個檔案,tim、doc、fdt。
1.先根據查詢欄位與詞找出該欄位所有的term(.tim檔案中的terms)
2.載入tim檔案(seekExact方法中currentFrame.loadBlock)
從terms查到匹配的term,匹配term下標記錄在SegmentTermsEnumFrame.nextEnt(SegmentTermsEnumFrame.scanToTermLeaf(BytesRef, boolean) line: 567)
3.從.tim的stats裡取出詞頻,metadata裡取出位置資訊
4.如果命中多個doc,定位到它們在doc檔案的開始下標
5.1 單個doc,直接取出tim metadata裡的singletonDocID
5.2 多個doc,讀出所有docId
6.根據docId,從fdt檔案中取出原字串。
然後以"path:txt"為查詢條件,來查詢索引檔案。我除錯發現會有6個步驟。資料主要來源於3個檔案,tim、doc、fdt。
1.先根據查詢欄位與詞找出該欄位所有的term(.tim檔案中的terms)
2.載入tim檔案(seekExact方法中currentFrame.loadBlock)
從terms查到匹配的term,匹配term下標記錄在SegmentTermsEnumFrame.nextEnt(SegmentTermsEnumFrame.scanToTermLeaf(BytesRef, boolean) line: 567)
3.從.tim的stats裡取出詞頻,metadata裡取出位置資訊
4.如果命中多個doc,定位到它們在doc檔案的開始下標
5.1 單個doc,直接取出tim metadata裡的singletonDocID
5.2 多個doc,讀出所有docId
6.根據docId,從fdt檔案中取出原字串。
最後總結下查詢過程如下圖,雖然這個過程比較簡單,但它是基於一個強大的索引檔案結構。這個索引結構很複雜,主要資料結構有:分詞資訊在tim檔案、倒排doc列表在doc檔案、原資料在fdt檔案。