这几天要用Lucene做点东西,所以看了一些文章和Lucene的wiki,进而发现了一些小问题,现在和大家分享。

至于创建索引和查找索引,现在网上随便一搜,都有一大堆的结果。现在要说的是删除索引。

在Apache的网站上的FAQ中,推荐用IndexWriter的deleteDocuments来实现删除符合条件的索引,经过多次的测试发现,用IndexWriter的deleteDocuments删除是会把.cfs文件删除掉(不知道什么原因,而且IndexWriter的各种构建方法我都试过了,也许是Lucene的一个bug)。所以我采用IndexReader的deleteDocuments来删除。代码如下:

 public static void main(String[] args) throws IOException {

       String indexDir = "e:\\javatest\\index2";
        Directory dir = new SimpleFSDirectory(new File(indexDir));
        IndexReader reader = IndexReader.open( dir,false);
        Term term = new Term("id","4");
        int delCnt = reader.deleteDocuments(term);
        reader.close();
        System.out.println("共删除索引条数:"+delCnt);
}

出现的现象有:

1、要删除的字段的值中全部是英数字的时候,删除没有问题。

2、要删除的字段的值包含中文时就删除不成功。

鉴于有第2种现象,我采用以下思想来解决的:在索引中加入一个全部是英数字的主键,如果要删除包含有中文的字段的条件时,先用包含中文的字段检索出主键数组,然后再根据主键一一删除。

注:可能有些大大已经用过这个方法或者有删除中文索引方法了,只是没有拿出来分享。但愿这篇文中能帮助一些人,也能起到抛砖引玉的作用。