摘要:索引是lucene最重要的過程,通過indexwriter的adddocument()方法可以加入各種document。本節將以adddocument為入口,探索lucene的索引過程。本次**示例基於lucene 6.2.1.
indexwriter的 adddocument
public
long
adddocument(iterable<? extends indexablefield> doc)
該方法並沒有實際的邏輯,需要注意的是它返回的是乙個sequence number。
indexwriter的 updatedocument
public
long
updatedocument(term term, iterable<? extends indexablefield> doc)
該方法在更新操作時,先刪除包含term的doc再新增新的doc。這個操作是原子性的,也就是同乙個reader在相同的索引上執行。
這裡的doc是傳入的document,analyzer是在indexwriterconfig中設定的analyzer,也可以不設定,預設是standardanalyzer。
documentswriter的 updatedocument
long updatedocument(final iterable<? extends indexablefield> doc, final analyzer analyzer, final term delterm))
該方法實現了對鎖的處理,正真新增的文件的方法繼續呼叫。
documentswriterperthread的 updatedocument
public
long
updatedocument(iterable<? extends indexablefield> doc, analyzer analyzer, term delterm)
這裡使用了靜態內部類docstate傳值,處理doc的事情交給了docconsumer。
docconsumer的 processdocument
public
void
processdocument()
}
docconsumer是乙個介面,預設使用到了它的實現類defaultindexingchain。這裡的fieldcount表示需要索引的field的個數,fieldgen表示該方法的呼叫次數(每呼叫一次,+1)。
defaultindexingchain的 processfield
private
intprocessfield(indexablefield field, long fieldgen, int fieldcount)
// invert indexed fields:
if (fieldtype.indexoptions() != indexoptions.none)
fp = getoraddfield(fieldname, fieldtype, true);
boolean first = fp.fieldgen != fieldgen;
fp.invert(field, first);
if (first)
} else
// add stored fields:
if (fieldtype.stored())
if (fieldtype.stored()) catch (throwable th) }}
docvaluestype dvtype = fieldtype.docvaluestype();
if (dvtype == null)
if (dvtype != docvaluestype.none)
indexdocvalue(fp, dvtype, field);
}if (fieldtype.pointdimensioncount() != 0)
indexpoint(fp, field);
}return fieldcount;
}
這裡的indexablefield代表索引時乙個的filed。在indexwriter中,你可以認為它就是乙個document的內部表示形式。indexablefield是乙個介面,它含有幾個重要的屬性:field-name, field-type, filed-value。
processfield的**不長,包含了索引的核心邏輯,因此我沒有刪減**。可以看到幾個關鍵引數fieldgen和fieldcount是如何操作的。
最終的寫操作呼叫了writefield。
storedfieldswriter的 writefield
public
void
writefield(fieldinfo info, indexablefield field)
這裡的寫操作主要是判斷filed的型別,然後交給具體的實現邏輯growablebytearraydataoutput
dataoutput的 write***
public
void
writebyte(byte b)
bytes[length++] = b;
}
這裡列出的是最簡單的writebyte()方法,其他方法都由該方法擴充套件而來。
public
void
writelong(long i) throws ioexception
到這裡,整個的索引過程就結束了。 UIApplication深入學習
新建乙個任意型別的ios應用工程,加入我們在class prefix輸入是tc,我們可以看到工程中生成乙個類 在main函式中,autoreleasepool 函式中 說明 當應用程式將要入非活動狀態執行,在此期間,應用程式不接收訊息或事件。比如來 了。說明 當應用程式入活動狀態執行,這個剛好跟上面...
深入學習CSS
什麼是css?在之前的這篇文章中已經介紹了初步的介紹,詳細請看 div加css進一步講解了css中的內容,先總結如下圖 其實在實際開發中,我們通常採用是外部樣式的匯入,這樣做的好處是對於很對有同樣設計樣式的頁面可以實現樣式的共享,這樣我們不僅僅可以節省了大量的時間,並且也方便我們可以靈活的呼叫的樣式...
block深入學習
block的宣告和使用看上一節就行了。本章主要講block內部的實現過程及原理。block的定義和函式指標非常相似 對比一下 block定義 void someblock 函式指標定義 void functionpionter void functionname 當然區別還是有的,block的返回型...