【Lucene】使用反射技术优化Lucene索引库的查询与创建
来源:互联网 发布:cad 布局 知乎 编辑:程序博客网 时间:2024/06/05 15:56
前面我们也使用用到了Lucene索引库的创建和查询,发现其代码太繁琐,有太多重复代码
例如:
1.获取Directory、Analyzer、MaxFieldLength、Version对象
2.将javabean对象封转成document对象
3.将document对象封转成javabean对象
接下来我们就创建一个LuceneUtil对索引库的创建和查询进行优化
package cn.qblank.util;import java.io.File;import java.lang.reflect.Method;import org.apache.commons.beanutils.BeanUtils;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;import org.apache.lucene.document.Field.Index;import org.apache.lucene.document.Field.Store;import org.apache.lucene.index.IndexWriter.MaxFieldLength;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.util.Version;/** * Lucene工具类 * @author Administrator * */public class LuceneUtil {private static Directory directory ;private static Analyzer analyzer ; private static Version version; private static MaxFieldLength maxFieldLength;static{try {directory = FSDirectory.open(new File("F:/LuceneDB"));version = Version.LUCENE_30;analyzer = new StandardAnalyzer(version);maxFieldLength = MaxFieldLength.LIMITED;} catch (Exception e) {e.printStackTrace();}}/** * javabean转docment * @param obj * @return * @throws Exception */public static Document javabean2documemt(Object obj) throws Exception{//创建document对象Document document = new Document();//获取字节码对象Class clazz = obj.getClass();//获取该对象中的私有属性: 使用强反射 这里使用类全称,防止和Lucene包起冲突java.lang.reflect.Field[] reflectfields = clazz.getDeclaredFields();//遍历字段for (java.lang.reflect.Field field : reflectfields) {//设置访问权限:因为字段是私有的field.setAccessible(true);String fieldName = field.getName();//给其拼装成get方法String methodName = "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);Method method = clazz.getMethod(methodName, null);//调用方法String returnValue = method.invoke(obj, null).toString();document.add(new Field(fieldName, returnValue, Store.YES, Index.ANALYZED));}return document;}/** * document转javabean,可以使用BeanUtils组件 * @throws Exception */public static Object document2javabean(Document document,Class clazz) throws Exception{//先获取字节码对象Object obj = clazz.newInstance();//获取到各个字段名java.lang.reflect.Field[] reflectField = clazz.getDeclaredFields();for (java.lang.reflect.Field field : reflectField) {//设置访问权限field.setAccessible(true);//获取各个的字段名和值String fieldName = field.getName();String fieldValue = document.get(fieldName);//使用BeanUtils组件封装对象BeanUtils.setProperty(obj, fieldName, fieldValue);}return obj;}public static Directory getDirectory() {return directory;}public static Analyzer getAnalyzer() {return analyzer;}public static Version getVersion() {return version;}public static MaxFieldLength getMaxFieldLength() {return maxFieldLength;}}
接下来我们继续进行创建和查询索引库
创建索引库优化
public void createIndexDB() throws Exception {Article article = new Article(3, "好室友版", "好室友就是我,我就是好室友");//将javabean封装成documment对象Document document = LuceneUtil.javabean2documemt(article);//创建IndexWriter对象IndexWriter indexWriter = new IndexWriter(LuceneUtil.getDirectory(), LuceneUtil.getAnalyzer(), LuceneUtil.getMaxFieldLength());//将document写入Lucene索引库indexWriter.addDocument(document);//关闭indexWriterindexWriter.close();}
查询索引库优化
public void findIndexDB() throws Exception {//存放封转结果对象的集合List<Article> arrayList = new ArrayList<Article>();//准备输入的值BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String keywords = br.readLine();//创建IndexSearcher字符流对象IndexSearcher indexSearcher = new IndexSearcher(LuceneUtil.getDirectory());//创建QueryParser对象QueryParser queryParser = new QueryParser(LuceneUtil.getVersion(), "content", LuceneUtil.getAnalyzer());//封转输入的数据Query query = queryParser.parse(keywords);//使用indexSearcher查询前100条记录TopDocs topDocs = indexSearcher.search(query, 100);//迭代出词汇表中符合条件的编号for (int i = 0; i < topDocs.scoreDocs.length; i++) {//取出封装编号和分数的ScoreDoc对象ScoreDoc scoreDoc = topDocs.scoreDocs[i];//获取结果编号int id = scoreDoc.doc;//根据编号去原始记录表中查询对应的document对象Document document = indexSearcher.doc(id);//将docuement对象封转成javabeanArticle article = (Article) LuceneUtil.document2javabean(document, Article.class);//将对象添加到集合中arrayList.add(article);}//遍历结果集合for (Article article : arrayList) {System.out.println(article);}//关闭indexSearcher流对象indexSearcher.close();}
运行结果如下:
阅读全文
0 0
- 【Lucene】使用反射技术优化Lucene索引库的查询与创建
- lucene 索引创建查询
- lucene索引创建与查询入门例子
- Lucene索引创建、查询与高亮
- Lucene 索引库的优化
- Lucene索引库的优化
- 【Lucene】索引库的优化
- lucene(索引的查询)
- 全文检索之lucene的优化篇--创建索引库
- 全文检索之lucene的优化篇--创建索引库
- lucene--索引的创建
- Lucene 查询索引库
- lucene创建索引,分组查询
- lucene 创建索引 查询实例
- Lucene的使用与优化
- lucene索引的添加与查询
- Lucene的入门例子 - 创建索引,利用索引查询
- 【Lucene】创建第一个Lucene索引库
- 流水线调度问题——动态规划
- hibernate映射笔记
- 5.2.从键盘任意输出一个整数,编程判断它的奇偶性。
- Linux下的ssh免密登录原理
- 网站卡顿,JS代码该优化了
- 【Lucene】使用反射技术优化Lucene索引库的查询与创建
- python 一些包的安裝
- 【BUG挖掘】win系统WideCharToMultiByte和MultiByteToWideChar
- hibernate缓存以及优化常识
- sdut 1028 Catch That Cow( BFS)
- SpringMVC和Struts2的区别
- 简单说 JavaScript的箭头函数
- 习题4.1(1)
- Eclipse常用快捷键