public class HelloLucene {
/**
建立索引
Field.Store.YES或者NO(存储域选项)
YES:表示会把这个域中的内容完全存储到文件中,方便进行还原[对于主键,标题可以是这种方式存储]
NO:表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完全还原(doc.get())[对于内容而言,没有必要进行存储,可以设置为No]
Field.index(索引选项)
Index.ANALYZED:进行分词和索引,适用于标题,内容等
Index.NOT_ANALYZED:进行索引,但不进行分词,比如身份证号,姓名,ID等,使用于精确搜索
Index.ANALYZED_NOT_NORMS:进行分词但是不存储norms信息,这个norms中包含了创建索引的时间和权值(排序)等信息
Index.NOT_ANALYZED_NOT_NORMS:即不进行分词也不存储norms信息
Index.NO:不进行索引
最佳实践
NOT_ANALYZED_NOT_NORMS Store.YES 标识符(主键,文件名),电话号码,身份证号,姓名,日期
ANALYZED Store.YES 文档标题和摘要
ANALYZED Store.NO 文档正文
NO Store.YES 文档类型,数据库主键(不进行索引)
NOT_ANALYZED Store.NO 隐藏关键字
索引文件结构剖析
.fnm保存着域字段的信息
.fdt和.fdx保存着store=yes的数据
.frq保存着哪些相同的单词出现多少次(可用作排序和评级)
.nrm专门用来保持一些评级信息
.tii和.tis保存着索引里面的所有信息
文档和域的概念
文档相当于表中的每一条记录,域相当于表中的每一个字段
*/
public void index(){
IndexWriter writer = null;
try {
//1、创建Directory(索引位置)
//Directory directory = new RAMDirectory();//建立在内存中
final Directory directory = FSDirectory.open(new File("d://lucene/index01"));//创建在硬盘上
//2、创建IndexWrite(写入索引)
final IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35));
writer = new IndexWriter(directory, config);
//3、创建Document对象
Document document = null;
//4、为Document添加Field(相当于添加属性:类似于表与字段的关系)
final File file = new File("d://lucene/example");//需要创建索引的文件
//遍历所有文件
for(final File f : file.listFiles()){
document = new Document();
//将内容添加成索引
document.add(new Field("content", new FileReader(f)));
/*
Field.Store.YES:将文件的全名存储到索引中,Field.Index.NOT_ANALYZED:不进行分词
Store.YES 保存 可以查询 可以打印内容
Field storeYes = new Field("storeyes","storeyes",Store.YES,Index.TOKENIZED);
Store.NO 不保存 可以查询 不可打印内容 由于不保存内容所以节省空间
Field storeNo = new Field("storeno","storeno",Store.NO,Index.TOKENIZED);
Store.COMPRESS 压缩保存 可以查询 可以打印内容 可以节省生成索引文件的空间,
Field storeCompress = new Field("storecompress","storecompress",Store.COMPRESS,Index.TOKENIZED);
至此,对于理解Store.YES,Store.NO 就是不存储就不能直接获取此字段的内容,存储了就可以。但是两者都可以用于检索。
*/
//将文件名称添加成索引
document.add(new Field("filename", f.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED));
//将文件路径添加成索引
document.add(new Field("path", f.getAbsolutePath(),Field.Store.YES,Field.Index.NOT_ANALYZED));
//5、通过IndexWriter添加文档到索引中
writer.addDocument(document);
}
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(writer != null){
try {
writer.close();
writer = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//测试创建索引
public static void main(String[] args) {
HelloLucene hl = new HelloLucene();
hl.index();
}
}