Lucene学习-CRUD

来源:互联网 发布:sqlserver下载 64位 编辑:程序博客网 时间:2024/05/16 07:08

对Lucene的CRUD进行了简单的封装,算是阶段总结吧,封装的时候发现重新造一个完美的轮子是困难的。。。还是自己水平有限,等学完Lucene之后希望进行一个可行,更具有实用性的封装。
需要注意的事
在update中浪费了大量时间,结果发现
indexWriter.updateDocument(null, document);中Term设置为null可是可以的。。。会把所有的document属性update,而加上Term只是update改变的属性

创建ArticleDao.java类

package com.bart.lucene.curd;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.apache.lucene.document.Document;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.Term;import org.apache.lucene.queryParser.QueryParser;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.Query;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.TopDocs;import org.junit.Before;import org.junit.Test;import com.bart.lucene.entity.Article;import com.bart.lucene.util.LuceneUtils;/** * 封装CRUD类 * @author hp */public class ArticleDao {    /**     * 增加Article对象到索引库     * @param article     * @throws Exception      */    public void add(Article article) throws Exception{        Document document = LuceneUtils.javaBean2Document(article);        IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(),LuceneUtils.getAnalyzer(),LuceneUtils.getMaxFieldLength());        indexWriter.addDocument(document);        indexWriter.close();    }    /**     * 批量增加Article对象到索引库     * @param list     * @throws Exception      */    public void addAll(List<Article>list) throws Exception{        for(Article article : list){            add(article);        }    }    /**     * 根据关键词查询     * @param keyword:查询关键字     * @param attr :要查询的Article字段,必须和Article字段名字相同     * @return 返回document对象的集合     * @throws Exception      */    public List<Document> search(String keyword,String attr) throws Exception{        List<Document> documentList = new ArrayList<Document>();        // 2. 创建indexSearcher        IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.getDirectory());        // 3. 创检查询解析器对象        QueryParser queryParser = new QueryParser(LuceneUtils.getVersion(),attr,LuceneUtils.getAnalyzer());        // 4. 创建对象封装查询关键字        Query query = queryParser.parse(keyword);        // 5. 查询        int MAX_RECORD=100;        TopDocs topDocs = indexSearcher.search(query, MAX_RECORD);        ScoreDoc[] scoreDocs = topDocs.scoreDocs;        Document document = null;        //如果查找到结果        if(scoreDocs!=null && scoreDocs.length >0){            // 6. 迭代词汇表中符合条件的编号            for(int i=0;i<topDocs.scoreDocs.length;i++){                // 6.1 取出封装编号和分数的scoreDoc对象                ScoreDoc scoreDoc = topDocs.scoreDocs[i];                // 6.2 取出来每一个编号                int no = scoreDoc.doc;                // 6.3 根据编号去索引库中原始记录表中查询对应的document对象                document = indexSearcher.doc(no);                documentList.add(document);            }            return documentList;        }else {            return null;        }    }    /**     * 升级索引库中对应的Article     * @param article :需要修改的Article对象     * @param attrName :要修改的Article属性名,必须和Article类字段同名     * @throws Exception      */    public void update(Article article,String attrName) throws Exception{        IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());        Document document  = LuceneUtils.javaBean2Document(article);        //先查询该字段根据id查询唯一结果        List<Document>list = search(article.getId().toString(),"id");        if (list!=null&&list.size()>0) {            System.out.println(list.get(0).get(attrName)+"--->");            /*             * 参数一:term表示需要更新的document对象,id表示document对象中的id属性,7表示该id属性的值             * 参数二:新的document对象             */            Term term = new Term("id",article.getId().toString());            System.out.println(document.get(attrName));//            indexWriter.updateDocument(null, document);            indexWriter.updateDocument(term,document);//核心            indexWriter.close();        }else {            throw new RuntimeException("Article not exist , make sure Article have 'id' arrtibute");        }    }    /**     * 删除一个Article     * @param article     * @throws Exception      */    public void delete(Article article) throws Exception{        IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(),LuceneUtils.getAnalyzer(),LuceneUtils.getMaxFieldLength());        indexWriter.deleteDocuments(new Term("id","2"));//核心        indexWriter.close();    }    /**     * 删除所有的Article     * @throws Exception     */    public void deleteAll() throws Exception{        IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(),LuceneUtils.getAnalyzer(),LuceneUtils.getMaxFieldLength());        indexWriter.deleteAll();//核心        indexWriter.close();    }    /*      * 测试方法     */    private ArticleDao articleDao;    @Before    public void before(){        articleDao = new ArticleDao();    }    @Test    public void testAdd() throws Exception{        Article article = new Article(4,"HDD硬盘","HDD硬盘是机械硬盘,是迄今为止最常用的硬盘");        articleDao.add(article);    }    @Test    public void testAddAll() throws Exception{        Article article1 = new Article(5,"HDD硬盘","HDD硬盘是机械硬盘,是迄今为止最常用的硬盘");        Article article2 = new Article(6,"SSD硬盘","HDD硬盘是固态硬盘,是迄今为止最速度最快的硬盘");        Article article3 = new Article(7,"显示器","显示器是电脑的输出设备");        Article article4 = new Article(8,"键盘","键盘是常用的输入设备");        Article article5 = new Article(9,"鼠标","鼠标也是一种常用的输入设备");        List<Article>list = new ArrayList<Article>();        list.add(article1);        list.add(article2);        list.add(article3);        list.add(article4);        list.add(article5);        addAll(list);    }    @Test    public void testSearch() throws Exception{        List<Document>list = search("显卡","title");//id/title/content        if (list!=null&&list.size()>0) {            System.out.println(list.get(0).get("title"));//查询关键词“电脑”结果:4        }else {            System.out.println("查询结果为空。。。");        }    }    @Test    public void testUpdate() throws Exception{        Article article = new Article(2,"显卡N","显卡是电脑的显示输出部件");        update(article, "title");    }    @Test    public void testDelete(){    }    @Test    public void testDeleteAll(){    }}
1 0
原创粉丝点击