搜索引擎学习(五)Lucene操作索引

一、代码分析

/**
 * Lucene入门
 * 操作索引
 */
public class ManageIndex {

    public IndexWriter getIndexWriter() throws Exception {
        //设置索引库的位置
        Directory directory = FSDirectory.open(new File("E:\\zhanghaoBF\\luceneSolr\\indexLibrary").toPath());
        Analyzer analyzer = new StandardAnalyzer();//创建分词器对象(官方推荐标准分词器)
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);//设置使用的分词器
        return new IndexWriter(directory, indexWriterConfig);//索引对象
    }

    /**
     * 全删除(PS:索引里面的文档也会删掉)
     *
     * @throws Exception
     */
    @Test
    public void deleteAllIndex() throws Exception {
        IndexWriter indexWriter = getIndexWriter();//获取索引的流对象
        indexWriter.deleteAll();//删除全部索引
        indexWriter.close();//关流
    }

    /**
     * 按条件删除(PS:索引里面的文档也会删掉)
     *
     * @throws Exception
     */
    @Test
    public void deleteIndex() throws Exception {
        IndexWriter indexWriter = getIndexWriter();//获取索引的流对象
        Query query = new TermQuery(new Term("fileContent", "lucene"));//PS:TermQuery为精准匹配
        indexWriter.deleteDocuments(query);//按条件删除索引
        indexWriter.close();//关流
    }

    /**
     * 修改(PS:先删除后新增,与数据库里面的修改不一样,注意区分)
     *
     * @throws Exception
     */
    @Test
    public void updateIndex() throws Exception {
        //获取索引的流对象
        IndexWriter indexWriter = getIndexWriter();

        //构建一个文档对象
        Document doc = new Document();
        doc.add(new TextField("fileName", "新的文件名称", Field.Store.YES));
        doc.add(new TextField("fileContent", "新的文件内容", Field.Store.YES));

        //调用更新操作,先把符合条件的索引删掉(包括term和存在索引库的文档),然后把刚才新增的文档对象加入到索引库中
        indexWriter.updateDocument(new Term("fileName", "是"), doc);//按条件删除索引,再加入新的索引
        //PS:删掉的文档还是会占用对应的文档ID,新增的文档排在最后(和数据库ID自增时的删除再添加一个道理)

        //关流
        indexWriter.close();
    }
}

二、注意事项

1、删除的时候,索引库里对应ID下的term和文档都会删除

2、修改操作其实是先把符合条件的term和文档都会删掉,然后再加入新的文档。

3、删掉的文档,文档ID不会释放,还是被占用的。

4、流用完一定要记得关。

猜你喜欢

转载自www.cnblogs.com/riches/p/11450606.html
今日推荐