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应该包含的三部分:名称,值,类型。