1. 程式人生 > >Lucene深入學習(5)Lucene的Document與Field

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應該包含的三部分:名稱,值,型別。