建立索引的过程
建立索引是搜索引擎的第一步,建立索引可以分为以下几个步骤:
提取文本信息
构建Document
分析
建立索引
提取文本信息
Lucene
对文档数据建立索引的第一步就是把这些需要建立索引的文档数据转换为Lucene能够处理的类型。实际上Lucene是无法处理pdf, txt, doc ... 这些格式的物理数据的,那么如果有一堆PDF格式的文件或者是DOC格式的文件需要建立索引,首要的事情就是从这些格式的文件里头抽取出文本信息。然后把这些抽取出来的文本信息构建Document和Field。
构建Document
这是建立索引过程的第二步,Lucene从硬盘中读取物理文件,然后对这些文件建立索引,将索引保存在一个指定的目录下.那么文件的格式是多种多样的,有PDF,TXT,DOC等等。所以这是一个很复杂的事情。为此Lucene自带了一个Docement类,这个类屏蔽了文件格式,也就是说Lucene是无法对PDF,TXT,DOC等物理文件建立索引的,它只能对Document文件建立索引,Document是一个虚拟的文件,事实上它并不存在。它只起一个包装的功能,那么建立索引的第一步就是把各种数据源(就是各种不同格式的文件,比如PDF)转换为Document格式。
下面仔细看看
Document
的用法
:
package testlucene.IndexTest;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.Reader;
import org.apache.lucene.document.DateField;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
public class DocumentTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
/**
*
使用指定的文件构造
Document
对象
* @param f
文件名
* @return
* @throws FileNotFoundException
*/
public Document document(File f) throws FileNotFoundException{
//
新建一个空
Document
对象
Document doc = new Document();
//
添加文件的路径到字段
path
中
doc.add(Field.Keyword("path", f.getAbsolutePath()));
//
添加文件最后一次修改的时间信息到字段
modified
中
doc.add(Field.Keyword("modified", DateField.timeToString(f.lastModified())));
//
添加文件的内容到字段
content
中
FileInputStream is = new FileInputStream(f);
Reader reader = new BufferedReader(new InputStreamReader(is));
doc.add(Field.Text("content", reader));
//
返回已经假载数据的
doc
对象
return doc;
}
}
总结:
任何一个需要被索引的
”
文件
”
最终都必须转换为
Document
对象才可以被索引和搜索到
,
实际上并非物理文件才可以被索引和搜索,任何数据源经过被组织后都可以被构建成一个
Document
对象。更进一步的说
Lucene
并不为任何实际物理文件建立索引,而是对
Document
对象建立索引
,
那么我们可以把
Document
看做一个虚拟的文件,它是一个工厂,任何格式的数据源都经过这个工厂转换为相同格式的数据,以方便
Lucene
建立索引和搜索
.
使用
Document
的好处就是
Lucene
可以不用跟任何格式的具体文件关联,无论需要被索引的文件是什么格式,
Lucene
都不理会,它需要的是程序员把这些具体格式的数据源转换为
Document
格式。属于封装模式的一种体现。