当前位置: 代码迷 >> 综合 >> Lucene学习-CRUD
  详细解决方案

Lucene学习-CRUD

热度:69   发布时间:2023-12-16 04:58:26.0

对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. 创建indexSearcherIndexSearcher 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;@Beforepublic void before(){articleDao = new ArticleDao();}@Testpublic void testAdd() throws Exception{Article article = new Article(4,"HDD硬盘","HDD硬盘是机械硬盘,是迄今为止最常用的硬盘");articleDao.add(article);}@Testpublic 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);}@Testpublic void testSearch() throws Exception{List<Document>list = search("显卡","title");//id/title/contentif (list!=null&&list.size()>0) {System.out.println(list.get(0).get("title"));//查询关键词“电脑”结果:4}else {System.out.println("查询结果为空。。。");}}@Testpublic void testUpdate() throws Exception{Article article = new Article(2,"显卡N","显卡是电脑的显示输出部件");update(article, "title");}@Testpublic void testDelete(){}@Testpublic void testDeleteAll(){}
}
  相关解决方案