lucene3.0的增删改查

来源:互联网 发布:淘宝关闭货到付款流程 编辑:程序博客网 时间:2024/06/15 05:52

1.简单封装一下luncene的对象(lunceneUtil)

package cn.xt.crud;import java.io.File;import java.lang.reflect.Field;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field.Index;import org.apache.lucene.document.Field.Store;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.util.Version;public class LuncenUtil {public static Analyzer analyzer;public static Directory directory;private LuncenUtil(){}static {try {analyzer = new StandardAnalyzer(Version.LUCENE_30);directory = FSDirectory.open(new File("./indexDir"));} catch (Exception e) {e.printStackTrace();}}/** * 将bean封装成Document对象 *  * @param bean * @return * @throws Exception */public static <T> Document bean2Document(T bean) throws Exception {Document doc = new Document();Class<? extends Object> clazz = bean.getClass();Field[] beanfields = clazz.getDeclaredFields();for (Field field : beanfields) {field.setAccessible(true);String name = field.getName();String value = field.get(bean).toString();//System.out.println(value);boolean flag = (name!=null && name.equals("id"));org.apache.lucene.document.Field luncenField = new org.apache.lucene.document.Field(name, value,Store.YES,flag?Index.NOT_ANALYZED:Index.ANALYZED);doc.add(luncenField);}return doc;}}

2.编写增删改查测试

package cn.xt.crud;import org.apache.lucene.document.Document;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriter.MaxFieldLength;import org.apache.lucene.index.Term;import org.apache.lucene.queryParser.MultiFieldQueryParser;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.apache.lucene.util.Version;import org.junit.Before;import org.junit.Test;import cn.xt.pojo.Article;public class IndexCRUD {Article article = null;@Beforepublic void setUp() throws Exception {article = new Article();article.setId(1);article.setTitle("luncene 文章");article.setContent("是一个非常好用的全文搜索技术,very good。");}@Testpublic void testCreateIndex() throws Exception {IndexWriter writer = new IndexWriter(LuncenUtil.directory,LuncenUtil.analyzer, MaxFieldLength.LIMITED);writer.addDocument(LuncenUtil.bean2Document(article));writer.close();}@Testpublic void testDelete() throws Exception {IndexWriter writer = new IndexWriter(LuncenUtil.directory,LuncenUtil.analyzer, MaxFieldLength.LIMITED);//关键词对象,这里代表名为title的字段中的关键词luncene封装成关键词对象(前提是内容是允许分词的,Analyzer)Term term = new Term("title", "luncene");//一般删除索引都用关键词对象writer.deleteDocuments(term);writer.close();}@Testpublic void testUpdate() throws Exception {article.setTitle("heritrix 也是一个好东西");//luncene中的update其实就是先删除,在添加IndexWriter writer = new IndexWriter(LuncenUtil.directory,LuncenUtil.analyzer, MaxFieldLength.LIMITED);Term term = new Term("title", "luncene");writer.updateDocument(term, LuncenUtil.bean2Document(article));writer.close();}@Testpublic void testSearch() throws Exception {IndexSearcher search = new IndexSearcher(LuncenUtil.directory);//这里使用了一个可以传多个字段的查询解析器,表示从title和content字段中查找QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30,new String[] {"title","content"}, LuncenUtil.analyzer);Query query = parser.parse("luncene");TopDocs topDocs = search.search(query, 2);//文档评分对象,描述关键词匹配度ScoreDoc[] scoreDocs = topDocs.scoreDocs;for (ScoreDoc scoreDoc : scoreDocs) {int idx = scoreDoc.doc;//索引的下标Document doc = search.doc(idx);Article article = new Article();article.setId(Integer.parseInt(doc.get("id")));article.setTitle(doc.get("title"));article.setContent(doc.get("content"));System.out.println(article);}}}

3.说明

luncene中的索引删除一般是通过term关键词对象来删除的,删除后会生成一个*.del的文件。

而修改其实就是先删除,然后在创建。


0 0