package indexwriter;
//FieldWriter的addDocument方法
import java.io.IOException;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
public class FieldWriter {
final void addDocument(Document doc) throws IOException{
//对所有的fields进行遍历,计算有多少个field是需要存储的
while(fields.hasMoreElements()){
Field field = (Field) field.nextElement();
if(field.isStored())
storedCount++;
}
//将总共需要存储的field的数量写入.fdt文件
fieldsStream.writeVInt(storedCount);
//获取所有的fields
fields = doc.fields();
//遍历
while(fields.hasMoreElements()){
Field field = (Field) fields.nextElement();
//如果field需要存储
if(field.isStored()){
//向.fdt中写入field的编号
fieldsStream.writeVInt(fieldInfos.fieldNumber(field.name()));
//使用位运算来来表示当前field的各种属性
byte bits = 0;
if(field.isTokenized())
bits |= FieldsWriter.FIELD_IS_TOKENIZED;
if(field.isBinary())
bits |= FieldsWriter.FIELD_IS_BINARY;
if(field.isCompressed())
bits |= FieldsWriter.FIELD_IS_COMPRESSED;
//向.fdt中写入field的属性
fieldsStream.writeByte(bits);
//如果fields需要压缩
if(field.isCompressed())
{
//compression is enable for the current field
byte[] data = null;
//如果这是一个二进制的field
if(field.isBinary()){
//将其压缩
data = compress(field.binaryValue());
}else{
//不是二进制的field,按UTF-8方式读出byte码然后压缩
data = compress(field.stringValue().getBytes("UTF-8"));
}
//记录下field数据长度
final int len = data.length;
//向.fdt中写入长度
fieldsStream.writeVint(len);
//向.fdt中写入field的值
fieldsStream.writeBytes(data, len);
}
//如果field不需要压缩
else{
//如果field是二进制
if(fields.isBinary){
//把二进制字节取出
byte[] data = field.binaryValue();
//计算field长度
final int len = data.length;
//向.fdt中写入长度
fieldsStream.writeVint(len);
//向.fdt中写入field的值
fieldsStream.writeBytes(data, len);
}
//如果field不需要压缩
else{
//如果field是二进制
if(field.binaryValue()){
//把二进制按字节取出
byte[] data = field.binaryValue();
//计算field长度
final int len = data.length;
//向.fdt中写入长度
fieldsStream.writeVint(len);
//向.fdt中写入field中写入field的值
fieldsStream.writeBytes(data, len);
}else{
//如果不是二进制的就直接向.fdt中写入field的值
fieldStream.writeString(field.stringValue());
}
}
}
}
}
}
}
//FieldWriter的addDocument方法
import java.io.IOException;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
public class FieldWriter {
final void addDocument(Document doc) throws IOException{
//对所有的fields进行遍历,计算有多少个field是需要存储的
while(fields.hasMoreElements()){
Field field = (Field) field.nextElement();
if(field.isStored())
storedCount++;
}
//将总共需要存储的field的数量写入.fdt文件
fieldsStream.writeVInt(storedCount);
//获取所有的fields
fields = doc.fields();
//遍历
while(fields.hasMoreElements()){
Field field = (Field) fields.nextElement();
//如果field需要存储
if(field.isStored()){
//向.fdt中写入field的编号
fieldsStream.writeVInt(fieldInfos.fieldNumber(field.name()));
//使用位运算来来表示当前field的各种属性
byte bits = 0;
if(field.isTokenized())
bits |= FieldsWriter.FIELD_IS_TOKENIZED;
if(field.isBinary())
bits |= FieldsWriter.FIELD_IS_BINARY;
if(field.isCompressed())
bits |= FieldsWriter.FIELD_IS_COMPRESSED;
//向.fdt中写入field的属性
fieldsStream.writeByte(bits);
//如果fields需要压缩
if(field.isCompressed())
{
//compression is enable for the current field
byte[] data = null;
//如果这是一个二进制的field
if(field.isBinary()){
//将其压缩
data = compress(field.binaryValue());
}else{
//不是二进制的field,按UTF-8方式读出byte码然后压缩
data = compress(field.stringValue().getBytes("UTF-8"));
}
//记录下field数据长度
final int len = data.length;
//向.fdt中写入长度
fieldsStream.writeVint(len);
//向.fdt中写入field的值
fieldsStream.writeBytes(data, len);
}
//如果field不需要压缩
else{
//如果field是二进制
if(fields.isBinary){
//把二进制字节取出
byte[] data = field.binaryValue();
//计算field长度
final int len = data.length;
//向.fdt中写入长度
fieldsStream.writeVint(len);
//向.fdt中写入field的值
fieldsStream.writeBytes(data, len);
}
//如果field不需要压缩
else{
//如果field是二进制
if(field.binaryValue()){
//把二进制按字节取出
byte[] data = field.binaryValue();
//计算field长度
final int len = data.length;
//向.fdt中写入长度
fieldsStream.writeVint(len);
//向.fdt中写入field中写入field的值
fieldsStream.writeBytes(data, len);
}else{
//如果不是二进制的就直接向.fdt中写入field的值
fieldStream.writeString(field.stringValue());
}
}
}
}
}
}
}