热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简单封装Lucenene的IndexWriter、IndexSearcher对象

1:简单封装Lucenene的IndexWriter、IndexSearcher对象2:不用反复创建再调用再传递对象。3:简化doucment与javabean

导包以下4个包:

bubuko.com,布布扣


封装类

package cn.lhzd.test;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
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.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
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.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
/**
*
* @author hubiao
* @date:2014-03-22 1:封装IndexWrite、IndexSearcher对象。只初始化一次 2:在结束JVM时释放资源
*
*/
public class luceneUtils {
private static String savaIndexPath = "./indexWrite";

/* 增、删、改 */
private static IndexWriter indexWriter;
/* 执行查询 */
private static IndexSearcher indexSearcher;
/*分词器*/
private static Analyzer analyzer;

/*目录*/
private static Directory directory;
static {
try {
// 创建保存目录、分词器
directory = FSDirectory.open(new File(savaIndexPath));
analyzer = new StandardAnalyzer(Version.LUCENE_36);
//监听线程,当JVM结束时,就执行此线程。释放资源
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run(){
closeIndexWrite();
closeIndexSearcher();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
public static IndexWriter getIndexWriter() {
if(indexWriter==null){
try {
IndexWriterConfig indexCpnfig = new IndexWriterConfig(Version.LUCENE_36, analyzer);
indexWriter = new IndexWriter(directory, indexCpnfig);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return indexWriter;
}
/*关闭indexWrite*/
public static void closeIndexWrite(){
if(indexWriter!=null){
System.out.println("关闭indexWriter对象");
try {
indexWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static IndexSearcher getIndexSearcher(){
if(indexSearcher==null){
try {
indexSearcher = new IndexSearcher(IndexReader.open(FSDirectory.open(new File(savaIndexPath))));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return indexSearcher;
}

/*关闭indexSearcher*/
public static void closeIndexSearcher(){
if(indexSearcher!=null){
System.out.println("关闭indexSearcher对象");
try {
indexSearcher.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


/* 添加索引
* array 添加的索引值
* write 操作索引对象
*/
@SuppressWarnings("rawtypes")
public static void addDocument(List array,IndexWriter write) {
Document doc = new Document();
for (Object ins : array) {
Class clazz = ins.getClass();
Field[] fields = clazz.getDeclaredFields();
for (int i = 0; i Field field = fields[i];
//根据属性获取方法名、把值赋给指定set方法
String name = field.getName();
String fieldName = name.substring(0,1).toUpperCase();
fieldName = String.format("get%s%s", fieldName,name.substring(1));
try{
Method method = clazz.getMethod(fieldName);
Object aaa = method.invoke(ins);
doc.add(new org.apache.lucene.document.Field(name,aaa.toString(),Store.YES,Index.ANALYZED));
}catch(Exception ex){
throw new RuntimeException(String.format("找不到{0},异常信息:{1}",fieldName,ex.getMessage()));
}
}
}
try {
write.addDocument(doc);
write.commit();//提交
} catch (Exception e) {
e.printStackTrace();
}
}
/* 查询索引
* param:索引字段参数
* paramObj:匹配值
* searcher:查询索引对象
* clazz:把索引值都包装到指定对象的
*return List:符合条件的对象
*/
@SuppressWarnings({"rawtypes","unchecked"})
public static List selectDocument(String[] param,String paramObj,IndexSearcher searcher,Class clazz) {
//包装数据的容器
List array = new ArrayList();

//创建搜索对象
MultiFieldQueryParser parserObject = new MultiFieldQueryParser(Version.LUCENE_36,param,analyzer);

try {
Query query = parserObject.parse(paramObj);
TopDocs search = searcher.search(query, 100);
System.out.println("查询到记录:"+search.totalHits+"条");
ScoreDoc[] scoreDocs = search.scoreDocs;

for (int x = 0; x Object instance = clazz.newInstance();
ScoreDoc scoreDoc = scoreDocs[x];
//获取索引位置
int doc = scoreDoc.doc;
Document document = searcher.doc(doc);
Field[] fields = clazz.getDeclaredFields();
for (int i = 0; i Field field = fields[i];
//根据属性获取方法名、把值赋给指定set方法
String name = field.getName();
String fieldName = name.substring(0,1).toUpperCase();
fieldName = String.format("set%s%s", fieldName,name.substring(1));
try{
Method method = clazz.getMethod(fieldName, field.getType());
String st = document.get(name);
Class type = field.getType();
Constructor cOnstructor= type.getConstructor(String.class);
Object newInstance = constructor.newInstance(st);
method.invoke(instance,new Object[]{newInstance});
}catch(Exception ex){
throw new RuntimeException(String.format("找不到%s,异常信息:%s",fieldName,ex.getMessage()));
}
}

array.add(instance);
}
}catch(Exception ex){
throw new RuntimeException(ex);
}

return array;
}
}测试代码

//写入
@Test
public void writeIndex() throws Exception
{

IndexWriter indexWriter = luceneUtils.getIndexWriter();
List array = new ArrayList();
Post post = new Post();
post.setId(88l);
post.setTitle("为什么要喜欢lucene");
post.setContext("因为全文检索(Full-Text Retrieval)是指以文本作为检索对象,找出含有指定词汇的文本。全面、准确和快速是衡量全文检索系统的关键指标。");
User user = new User();
user.setId(2l);
user.setTitle("各个国家的首都在哪里?");
user.setContext("世界各国首都: 亚洲各国首都:中国(北京)、日本(东京)、韩国(首尔)、朝鲜(平壤)、泰国(曼谷)、印度(新德里)、越南(河内)、缅甸(仰光)、孟加拉(达卡)..");
array.add(user);
array.add(post);
luceneUtils.addDocument(array, indexWriter);
}

//读取
@Test
public void readIndex() throws ClassNotFoundException{
IndexSearcher searcher = luceneUtils.getIndexSearcher();
List array = luceneUtils.selectDocument(new String[]{"title"}, "为什么要喜欢lucene", searcher, Post.class);

for (Post p : array) {
System.out.println(p);
}
}

简单封装Lucenene的IndexWriter、IndexSearcher对象,布布扣,bubuko.com


推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
author-avatar
手机用户2502905381
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有