Lucene將每個字段的索引分開存儲。因此,當我們執行查詢「fld1:a AND fld2:b」時,我們對第一學期和第二學期的Termdoc進行迭代。這不可能更快。在數據庫的情況下,fld1和fld2的兩個分隔索引將運行緩慢,只有一個將被使用。在這種情況下,DB會爲fld1和fld2請求複合鍵。爲什麼lucene不需要組合索引,但關係數據庫呢?
我的問題是。爲什麼DB不能使用Lucene索引算法執行布爾查詢,如果它與DB索引一樣快並且dosn't需要不同的列組合?
Lucene的一些細節布爾查詢搜索: 它利用接口TermDoc。使用兩種方法boolean skipTo(int)
和boolean next()
的主要想法。所以它不依賴於術語順序(流行的或不流行的術語),因爲這些方法調用的計數總是作爲最不頻繁的項(由於skipTo方法)。所以在分層組合索引中沒有必要,它不會帶來任何額外的性能。
TermDocs t1 = searcher.docs(fld1:a);
TermDocs t2 = searcher.docs(fld2:b);
int doc = -1;
t1.next(); t2.next();
while(t1.doc()!=-1 && t2.doc()!=-1) {
if(t1.doc()<t2.doc()) {
if(!t1.skipTo(t2.doc)) return;
}
if(t2.doc()<t1.doc()) {
if(!t2.skipTo(t1.doc)) return;
}
if(t1.doc()==t2.doc()) {
println("found doc:"+t1.doc());
t1.next()
}
}
'在數據庫的情況下,fld1和fld2的兩個分隔索引將運行緩慢,只有一個將被使用。「這僅僅是MySQL的真實情況。 Postgres沒有這個問題。 –
你確定嗎? Db2也是如此。 – yura
那麼,我肯定知道它不是一個問題postgres = D http://www.postgresql.org/docs/8.3/static/indexes-bitmap-scans.html –