Lucene的增量索引没有那么智能,虽然根据文档所言,把下面的第三个参数设为false就是增量索引(true to create the index or overwrite the existing one; false to append to the existing index,注意这个append)。但是我发现,它与true的区别,仅仅在于不去删掉以前所有的索引文件而已,他并不能智能的分析到当前要被索引的文件是否已经被索引过,因此对先前文档作了修改,要重建索引的话,必须删除先前的这个文档所对应的索引
new IndexWriter(indexDir, new StandardAnalyzer(), false, new IndexWriter.MaxFieldLength(10000));
建立索引的关键步骤就是对IndexWriter添加Document,我是对文本文件进行分析的
File f = new File("text.txt");
Document doc = new Document();
doc.add(new Field("content", new FileReader(f))); // 由于文件内容比较大,没有保存,如果是要做高亮搜索词的话,需要保存,分析,并且指定词向量参数Field.TermVector
doc.add(new Field("title", "要被索引的字符串", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
参数的说明:
Field.Store.YES表示要对这个字符串进行存储,Field.Index.ANALYZED表示要对个字符串进行分析
虽然设置了增量索引,如果运行两次这个索引的代码,然后去搜索的话,会出现两条相同的结果。考虑到,一条doc对应一个文件,便想着给doc添加一个唯一标示的字段,索引之前检测是否存在,如果已经存在删除之
doc.add(new Field("fileid", "自定义的id", Field.Store.YES, Field.Index.NOT_ANALYZED));
保存这个id字段,但是不要对这个字段进行分析,如果分析了,对索引结果会有影响。刚开始计划使用文本路径设置id,但是不起作用,只有文件名的话可以,但没有唯一性,id的定制很重要。
删除doc的代码
writer.deleteDocuments(new Term("fileid", "自定义的id"));
关于是用IndexWriter来删除还是用IndexReader来删除可以参考下面文章
http://www.cnblogs.com/huangfox/archive/2010/10/14/1851031.html
为保持数据一致,作者建议使用indexwriter来做删除操作