这几天闲着没什么事,就鼓捣了一下Lucene的全文检索方面的内容,首先在Apache的Lucene站点
上大致浏览了一下Lucene的相关文档及知识,由于英文不怎么好,干脆直接找中文相关的内容看了,弄了两天,自己整了个Lucene的大致的实现程序,并且添加进自己的站点项目中,做了个简单的测试,出了一点效果,在这里将大致过程做个简单的记录:
1、在原有的maven项目上,增加了一个test-lucene的子模块,原有的与其相关的模块为test-persisit(主要做持久化操作),test-model(主要定义模型的模块), 大致的POM文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>test</artifactId>
<groupId>org.clzps</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>org.clzps</groupId>
<artifactId>test-lucene</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>test-lucene</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<lucene.version>3.1.0</lucene.version>
</properties>
<dependencies>
<!-- 项目模块相关依赖 -->
<dependency>
<groupId>org.clzps</groupId>
<artifactId>test-model</artifactId>
<version>${project.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.clzps</groupId>
<artifactId>test-persist</artifactId>
<version>${project.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers</artifactId>
<version>${lucene.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>${lucene.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>${lucene.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-smartcn</artifactId>
<version>${lucene.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
2、主要的Java文件内容,实现外部应用的直接调用,包括创建index过程,加载index过程(索引已经创建好),搜索过程,具体就不详细描述了,主要自己做记录,看代码:
public class LuceneService {
/**
* Logger
*/
// private final Logger logger = Logger.getLogger(getClass());
/**
* 分词器
*/
private static Analyzer analyzer = Constants.analyzer;
public static void setAnalyzer(Analyzer analyzer) {
LuceneServiceImpl.analyzer = analyzer;
}
/**
* 索引目录路径
*/
private static String indexDirPath = Constants.indexDirectoryPath;
public static void setIndexDirPath(String indexDirPath) {
LuceneServiceImpl.indexDirPath = indexDirPath;
}
/**
* Directory变量
*/
private static FSDirectory fsdirectory = null;
private static RAMDirectory ramDirectory = null;
private static IndexReader fsIndexReader = null;
private static IndexReader ramIndexReader = null;
private void IndexRamToDisk() {
IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_31, analyzer);
iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter fsIndexWriter = null;
try {
fsdirectory = FSDirectory.open(new File(indexDirPath));
fsIndexWriter = new IndexWriter(fsdirectory, iwConfig);
fsIndexWriter.addIndexes(new Directory[]{ramDirectory});
fsIndexWriter.optimize();
fsIndexWriter.close();
//关闭ramDirectory
ramDirectory.close();
ramDirectory = null;
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
loadIndex();
}
public void createIndex(List<ArticleData> objList) {
IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_31, analyzer);
iwConfig.setOpenMode(OpenMode.CREATE);
IndexWriter ramIndexWriter = null;
ramDirectory = new RAMDirectory();
try {
ramIndexWriter = new IndexWriter(ramDirectory, iwConfig);
ramIndexWriter.deleteAll();
ramIndexWriter.commit();
for(int i = 0; i < objList.size(); i++) {
Document doc = AnyObjects2DocumentUtils.Persist2Document(objList.get(i));
ramIndexWriter.addDocument(doc);
System.out.println(i);
}
ramIndexWriter.close();
IndexRamToDisk();
} catch (IOException e) {
e.printStackTrace();
}
}
public void loadIndex() {
try {
if(fsdirectory == null) {
fsdirectory = FSDirectory.open(new File(indexDirPath));
}
fsIndexReader = IndexReader.open(fsdirectory);
} catch (IOException e) {
e.printStackTrace();
}
}
public void search(String queryStr) {
Long start = new Date().getTime();
String[] fields = new String[]{"title","content"};
try {
Query query = new MultiFieldQueryParser(Version.LUCENE_31, fields, analyzer).parse(queryStr);
MultiReader multiReader = null;
if(fsIndexReader == null) return;
if(ramIndexReader == null) {
multiReader = new MultiReader(new IndexReader[]{fsIndexReader});
} else {
multiReader = new MultiReader(new IndexReader[]{fsIndexReader, ramIndexReader});
}
IndexSearcher indexSearcher = new IndexSearcher(multiReader);
TopDocs topDocs = indexSearcher.search(query, null, 100);
System.out.println("检索到【" + topDocs.totalHits + "】条匹配的结果!");
System.out.println("--------------------------------------------------------");
ScoreDoc[] scoreDoc = topDocs.scoreDocs;
for(int i = 0; i < scoreDoc.length; i++) {
Document document = indexSearcher.doc(scoreDoc[i].doc);
Object2DocumentUtils.PrintDocument(document);
}
Long end = new Date().getTime();
System.out.println("搜索时间:" + (end-start));
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、通过下面的测试代码,即可进行创建Index,加载Index和搜索过程了:
@Test
public void testCreateOrLoadIndex() {
File file = new File(indexDirectoryPath);
if(file.exists()) {
luceneService.loadIndex();
} else {
createIndex();
}
luceneService.search("事件");
}
分享到:
相关推荐
基于风光负荷不确定性的微电网两阶段鲁棒优化模型:投资与运行成本的综合考虑及CCG算法的Matlab+Yamilp+CPLEX求解方法,考虑风光负荷的不确定性,构建了微电网两阶段鲁棒优化容量配置模型,第一阶段目标函数为微电网投资成本,第二阶段目标函数为微电网的运行成本。 采用CCG算法求解。 包含非线性项的线性化处理。 程序代码matlab+yamilp+CPLEX ,核心关键词: 微电网; 两阶段鲁棒优化; 容量配置模型; CCG算法; 线性化处理; MATLAB; YAMILP; CPLEX 用分号分隔每个关键词的结果为: 微电网; 两阶段鲁棒优化; 容量配置模型; CCG算法; 线性化处理; MATLAB; Yamilp; CPLEX,微电网鲁棒优化模型:两阶段成本最小化与线性化处理
西门子S7-200PLC在Z35摇臂钻床控制系统中的应用与组态王组态设计研究,98西门子S7-200PLC和组态王组态Z35摇臂钻床控制系统组态设计PLC设计 ,西门子S7-200PLC; 组态王组态; 摇臂钻床控制系统; PLC设计,西门子S7-200PLC与组态王Z35摇臂钻床控制系统组态设计
烟花代码编程python满屏-10.排队接水——我直接把水吸过来.py
基于三菱PLC的喷灌控制系统设计及组态画面实现,No.393 三菱PLC组态王组态画面基于PLC的喷灌控制设计灌溉控制 ,基于三菱PLC; 喷灌控制设计; 组态王组态画面; 灌溉控制。,基于三菱PLC的喷灌控制设计:组态王组态画面应用
基于Dijkstra算法的路径规划Matlab代码:读取黑白色地图并实现图像上的路径规划示例,读取黑白色地图,在图片上进行路径规划matlab代码 路径规划算法基于读图识别的Dijkstra算法 随意设置坐标,规划路径 示例如下 ,读取地图; 路径规划算法; Dijkstra算法; 坐标设置; 规划路径,基于Dijkstra算法的Matlab黑白色地图路径规划代码
融合空间特征的债券图表数据文本检测方法研究.pdf
基于粒子群优化与遗传算法的高速列车横向悬挂模糊PID控制技术研究:s函数建模与仿真分析详解文件,基于粒子群 遗传算法的高速列车横向悬挂模糊PID控制-s函数搭建。 赠word详解文件 ,基于粒子群; 遗传算法; 高速列车横向悬挂; 模糊PID控制; s函数搭建,基于遗传算法的高速列车悬挂PID模糊控制的S函数构建方案
一种基于Retinex的非线性彩色图像增强算法.pdf
基于因式分解的逆合成孔径雷达三维成像技术及序列因子分解法研究,逆合成孔径雷达三维成像,因式分解法,序列因子分解法。 此部分只做了因式分解的工作,假设散射点已经准确提取并得到散射点坐标矩阵,利用因式分解恢复目标三维结构 ,逆合成孔径雷达三维成像; 因式分解法; 序列因子分解; 散射点提取; 散射点坐标矩阵; 恢复目标三维结构。,利用因式分解恢复三维结构:逆合成孔径雷达三维成像技术
MATLAB R2021b环境下深度学习驱动的车道线检测算法研究与应用,MATLAB环境下一种基于深度学习的车道线检测方法 算法运行环境为matlab r2021b,执行基于深度学习的车道线检测。 if batch ~= numBatches lastFrameIdx = miniBatchSize*batch; else 压缩包=数据+程序 ,核心关键词如下: MATLAB环境; 深度学习; 车道线检测; 算法运行环境; 批处理; 压缩包 以上关键词用分号分隔为: MATLAB环境; 深度学习; 车道线检测; 算法运行环境r2021b; 批处理(batch~numBatches); 压缩包(数据+程序) 注意:最后一个关键词“压缩包”并不是直接从您提供的信息中提炼出来的,而是根据您提到的“压缩包=数据+程序”这一句推断出来的。如果这不是您想要的核心关键词,请告诉我,我会进行相应的调整。,MATLAB深度学习车道线检测算法压缩包
西门子S7-200PLC在物料自动称量控制系统中的应用:基于称重配料混合程序的组态设计与王设计PLC程序设计,74基西门子S7-200PLC的物料自动称量控制系统称重配料物料混合程序组态设计组态设计组态王设计plc程序设计 ,核心关键词:西门子S7-200PLC;自动称量控制系统;物料混合程序;组态设计;组态王设计;PLC程序设计。,西门子S7-200PLC物料自动称量控制系统称重配料程序组态设计
优化无人机侦查与目标搜索路径规划:对未知区域进行覆盖并精确寻靶的Matlab代码解析与实践指南。,无人机覆盖搜索路径规划 无人机搜索目标路径规划 无人机侦查路径规划 对未知区域进行覆盖搜索,并且寻找目标 matlab代码有详细注释,可快速上手。 ,核心关键词:无人机; 覆盖搜索路径规划; 搜索目标路径规划; 侦查路径规划; 未知区域覆盖搜索; MATLAB代码注释。,**无人机未知区域覆盖搜索及目标路径规划Matlab代码详解**
shp格式,可直接导入arcgis使用
基于博途软件编程的11层电梯控制系统:文档齐全,优质售后保障的智能运行体验,基于PLC的单部11层电梯控制系统,采用博途软件编写提供画面,文档(含接线图,流程图,IO分配表)及优质的后服务。 最终运行效果,详见上方演示视频 ,核心关键词:PLC控制;11层电梯;博途软件;画面编写;文档资料;接线图;流程图;IO分配表;售后服务;演示视频。,"博途软件控制下的11层电梯系统,高效运行效果详见演示视频"
"飞剪追剪程序:PLC与伺服同步控制完整指南,适合新手学习与参考,包含PLC程序、触摸屏程序及CAD电路图纸",飞剪追剪程序plc程序伺服程序 同步控制 适合新手学习参考 包含PLC程序+触摸屏程序+CAD电路图纸。 ,飞剪追剪程序; PLC程序; 伺服程序; 同步控制; 新手学习参考; PLC程序+触摸屏程序; CAD电路图纸,适合新手的飞剪追剪程序全套教程:PLC+伺服同步控制
使用Matlab编程:无迹卡尔曼滤波算法(UKF)的编写及其在电池SOC估计中的应用,噪声系数自适应优化方案的研究。,使用matlab编写m脚本,编写无迹卡尔曼滤波算法(UKF)估计电池SOC,注释清晰。 卡尔曼滤波算法(EKF)锂电池SOC估计,噪声系数自适应 Matlab ,matlab; 无迹卡尔曼滤波算法(UKF); 电池SOC估计; 注释清晰; 噪声系数自适应。,Matlab无迹卡尔曼滤波(UKF)用于电池SOC估计的代码实现
Ansys LS-DYNA多孔延时起爆与重复起爆模拟的完整过程解析,Ansys ls_dyna多孔延时起爆,重复起爆模拟 全过程 ,Ansys;LS_dyna;多孔延时起爆;重复起爆模拟;全过程,Ansys LS-DYNA多孔延时重复起爆模拟全过程
FPGA驱动双目视觉系统:立体匹配、视差图与深度图生成技术的研究与应用,FPGA双目视觉 立体视觉 视差图 深度图 双目立体匹配sgm sgbm tang 20k 高云fpga usb摄像头采集图像 ,FPGA双目视觉;立体视觉;视差图;深度图;双目立体匹配sgm;sgbm;高云FPGA;USB摄像头图像采集。,基于FPGA的双目视觉系统:立体匹配与深度图生成
整个手套大盘的指数图如下.docx
基于AGV全覆盖移动避障的扫地机器人路径规划算法研究:深度优先搜索与随机碰撞对比,AGV全覆盖移动避障路径规划matlab代码 扫地机器人路径规划 第一类算法 全覆盖智能算法 %% 基于深度优先搜索算法的路径规划—扫地机器人移动仿真 % 返回深度优先搜索实现全覆盖的运行次数 % 将栅格模型的每一个栅格看成一个点 % 实际中栅格模型是连续的,在计算机处理时看作离散的 % 将栅格模型抽象为标识矩阵,矩阵对应位置的标记表示栅格对应位置的状态 第二对比算法 %% 随机碰撞的路径规划—扫地机器人移动仿真 % 返回深度优先搜索实现全覆盖的运行次数 % 将栅格模型的每一个栅格看成一个点 % 实际中栅格模型是连续的,在计算机处理时看作离散的 % 将栅格模型抽象为标识矩阵,矩阵对应位置的标记表示栅格对应位置的状态 ,核心关键词: 1. AGV全覆盖移动避障 2. 路径规划 3. Matlab代码 4. 扫地机器人路径规划 5. 第一类算法 6. 全覆盖智能算法 7. 深度优先搜索算法 8. 栅格模型 9. 标识矩阵 10. 随机碰撞的路径规划,"AGV全覆盖避障路径规划:Matlab代码实现与对比"