Lucene学习-CRUD

对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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值