還是以quickstart為例,說一下forward index的建立過程。
收集各個column的統計資料
**同dictionary index。
再次遍歷,按行處理每列的索引
iterator復位
// build the index
recordreader.rewind();
重新遍歷,對每行索引
logger.info("start building indexcreator!");
while (recordreader.hasnext())
indexrow的實現:
@override
public
void
indexrow(genericrow row) else
forwardindexcreatormap.get(column).index(docidcounter, dictionaryindex);
if (config.createinvertedindexenabled())
}docidcounter++;
}
對每乙個值,都需要在dictionary index中呼叫indexof以得到該值的位置。
public object indexof(object e) else
}
對於single value field來說,用二分查詢找位置,時間複雜度o(lgn)。不過找到之後會放在map裡,所以對於重複的value就是o(1)的時間複雜度了。
private integer indexofsv(object e)
return
new integer(searchablebytebuffer.binarysearch(0, bld.tostring()));
default:
break;
}throw
new unsupportedoperationexception("unsupported data type : " + spec.getdatatype() + " : " + " for column : "
+ spec.getname());
}
在forward index中實際儲存的是int,和column的type沒有關係。
@override
public
void
index(int docid, object e)
公式有點複雜,根據volumn的寬度來直接定位第n位的位置。注意column都是等寬的。對於string這種不等寬的column,會加padding變為等寬。
public
void
setint(int row, int col, int val)
}}
簡單來說,forward index包含的內容就是乙個一維陣列,每個元素對應該行該列的值在dictionary index中的位置。真正得到這個值就需要在dictionary index中進行一次o(1)的查詢。
rowid
value……
mi (第m行的值在dictionary index中的位置)……
nj (第n行的值在dictionary index中的位置)……
Python中的descriptor中的一點疑問
在我的印象中,類中的函式是可以有兩種呼叫方式的,如下 class b def func self return 10 b b b.func b.func b 於是,在之前研究descriptor的時候,我就有了幾點困惑 我將 更換成了如下兩個版本 版本1 import time class lazy...
python中的dict Python中的dict
dict python內建了字典 dict的支援,dict全稱dictionary,在其他語言中也稱為map,使用鍵 值 key value 儲存,具有極快的查詢速度。d print dict get michael d michael add a element d adam 67 print d...
zset中的score Redis中的事務
watch 監控某個或幾個key的變化 multi 接下來的命令不會立馬執行,會先放入乙個事務的佇列中 exec 執行事務佇列中的命令 unwatch 可以在watch執行之後 multi命令執行之前執行,效果是解除對某個key的監控 discard 可以在multi命令執行之後exec命令執行之前...