Lucene深入學習(5)Lucene的Document與Field
Document與Field
在Lucene中,document是一種邏輯檔案。可以近似地認為它表示的是計算機中的一個檔案。這個document是一種抽象的表示,它從各種維度來描述一個數據源中的每一條資料。
將一個Document與檔案系統中的檔案對應起來時,可以提取出很多資料單元,它們被一個稱之為Field的類表示。
這裡的Document-Field結構和關係型資料庫結構類似,資料庫的每一條記錄可以表示為一個document,而每一列可以用Field表示:
Doc id | Filed name1 | Field name2 | Field name3 |
---|---|---|---|
document1 | filed1 value | field2 value | field3 value |
document2 | field1 value | field2 value | field3 value |
Lucene文件中表明,Document是索引和查詢的最小單位。Document由一系列的Fields組成,每一個Field都有一個名字和值。每一個Document都應該至少有一個stored的filed,並且有一個主鍵id。
Document的實現邏輯
Document的內部實現相對簡單,主要方法有如下幾個:
/** 為document新增field */
public final void add(IndexableField field)
/** 刪除一個field */
public final void removeField(String field)
/** 根據Field名稱找出field, 如果多個Field名稱一樣,返回第一個 */
public final IndexableField getField(String name)
/** 返回能讀懂的document內容 */
public final Sting toString()
/** 把document中的所有field移除*/
public void clear()
可以看到,Document的主要方法都是在操作Field,還加入了toString()方便輸出document中的內容。
## Field的實現邏輯
Field是document的一部分,每一個Field都有三部分組成:名稱name,型別type,值value。目前大約有十多種功能各異的Fields: TextField,StringField,IntPoint,LongPoint,FloatPoint,DoublePoint,SortedDocValuesField,SortedSetValuesField,NumericaDocValuesField,SortedNumericDocValuesField,SotedField。
Field類中含有一個靜態列舉類:
“`java
public static enum Store {
/* 儲存該Field的原始值。表示在儲存值之前不使用 Analyzer/
YES,
/* 不儲存原始值於索引中 /
NO
}
“`
Filed類有眾多的構造方法:
“`java
public Field(String name, Reader reader, FieldType type)
public Field(String name, TokenStream tokenStream, FieldType type)
public Field(String name, byte[] value, FieldType type)
public Field(String name, byte[] value, int offset, int length, FieldType type)
public Field(String name, BytesRef bytes, FieldType type)
public Field(String name, String value, FieldType type)
“`
這些方法基本也表明了一個 Field應該包含的三部分:名稱,值,型別。