Lucene学习笔记2-Lucene的CRUD(V7.1)

在进行CRUD的时候请注意IndexWriterConfig的设置。
public class IndexCRUD {
    private String ids[]={"1","2","3"};
    private String citys[]={"jining","suzhou","shanghai"};
    private String desc[]={
            "Qingdao is a beautiful city.",
            "Nanjing is a city of culture.",
            "Shanghai is a bustling city."
    };

    private Directory dir;

    private IndexWriter getWriter()throws Exception{
        dir= FSDirectory.open(Paths.get(LuceneConstants.IndexDir01));
        Analyzer analyzer=new StandardAnalyzer();
        IndexWriterConfig config=new IndexWriterConfig(analyzer);
        //config.setOpenMode(IndexWriterConfig.OpenMode.CREATE);//删除和修改的时候不能把OpenMode设为CREATE,否则会忽略term全部删除
        IndexWriter indexWriter=new IndexWriter(dir,config);
        return indexWriter;
    }

  //建立索引
    public void createUpIndex() throws Exception{
        IndexWriter indexWriter=getWriter();

        for(int i=0;i<ids.length;i++){
            Document document=new Document();
            document.add(new StringField("id",ids[i], Field.Store.YES));
            document.add(new StringField("city",citys[i],Field.Store.YES));
            document.add(new TextField("desc",desc[i],Field.Store.YES));
            indexWriter.addDocument(document);
        }
        indexWriter.close();
    }

  //删除
    public void deleteWithoutMerge()throws Exception {
        IndexWriter writer = getWriter();
        System.out.println("删除前:" + writer.numDocs());
        writer.deleteDocuments(new Term("id", "1"));// 强制删除此时删除的文档并不会被完全删除,而是存储在一个回收站中的,可以恢复
        writer.commit(); //更改索引要提交,和提交数据库事务一个概念,真正的删除
        System.out.println("writer.maxDoc():" + writer.maxDoc());
        System.out.println("writer.numDocs():" + writer.numDocs());
        writer.close();
    }

  //删除后合并索引
    public void DeleteWithMerge()throws Exception{
        IndexWriter writer=getWriter();
        System.out.println("删除前:"+writer.numDocs());
        writer.deleteDocuments(new Term("id","3"));// 强制删除此时删除的文档并不会被完全删除,而是存储在一个回收站中的,可以恢复
        writer.forceMergeDeletes(); //强制合并删除的索引信息,索引量大的时候不推荐使用,真正的删除
        writer.commit();
        System.out.println("writer.maxDoc():"+writer.maxDoc());
        System.out.println("writer.numDocs():"+writer.numDocs());
        writer.close();
    }

    public void update()throws Exception{
        IndexWriter writer=getWriter();
        Document doc=new Document();
        doc.add(new StringField("id", "1", Field.Store.YES));
        doc.add(new StringField("city","qingdao",Field.Store.YES));
        doc.add(new TextField("desc", "It's a dressed city.", Field.Store.YES));
        writer.updateDocument(new Term("id","1"), doc);
        writer.close();
    }

    public List<String> Search() throws Exception{
        QueryParser queryParser=new QueryParser("desc",new StandardAnalyzer());
        Query query=queryParser.parse("city");

        if (null==dir) dir= FSDirectory.open(Paths.get(LuceneConstants.IndexDir01));
        IndexReader reader=DirectoryReader.open(dir);
        IndexSearcher searcher=new IndexSearcher(reader);
        TopDocs topDocs=searcher.search(query,5);

        List<String> list=new ArrayList<String>();
        for (ScoreDoc scoreDoc:topDocs.scoreDocs) {
            Document document = searcher.doc(scoreDoc.doc);
            list.add(document.get("id")+document.get("city")+":"+document.get("desc"));
        }
        reader.close();

        return list;
    }
}
 

 

posted on 2017-12-20 15:23  好好学习V天天向上  阅读(579)  评论(0编辑  收藏  举报

导航