对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(){
}
}