屌丝又发少年狂
左键盘,右鼠标
闲来无事学搜索。
好久没有学习新的技术了,一直在项目中晃悠。
Lucene,上学那会儿就想学习学习了,遥记得当年毕业答辩的时候我用的搜索功能是直接查询数据库,被答辩的老师狠狠的鄙视了。
下面是一个入门级别的demo,写到这里或许可以帮助都别人,主要的是为了自己以后备忘。
step1:下载lucene
step2:新建项目helloworld,并引进必要的包,[You need four JARs: the Lucene JAR, the queryparser JAR, the common analysis JAR, and the Lucene demo JAR. You should see the Lucene JAR file in the core/ directory you created when you extracted the archive -- it should be named something like lucene-core-{version}.jar. You should also see files called lucene-queryparser-{version}.jar, lucene-analyzers-common-{version}.jar and lucene-demo-{version}.jar under queryparser, analysis/common/ and demo/, respectively.] 我们这个demo中用到的是以下几个包:
lucene-analyzers-common-4.4.0.jar ,
lucene-core-4.4.0.jar ,
lucene-queryparser-4.4.0.jar.
step3:准备测试用的文档,我的是
public static final String PATH_INDEX = "E:\\temp\\index"; public static final String PATH_FILE = "E:\\temp\\document";
PATH_INDEX存放的是索引文件,PATH_FILE存放的是测试文档。
step4:前3步是准备工作,现在开始写代码。代码就不一一描述了,在关键地方我都添加了注释
code1:新建/更新索引
package org.i94livng.lucene; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; 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.Store; import org.apache.lucene.document.StringField; import org.apache.lucene.document.TextField; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.Term; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; /** * 建索引 * @author HuHongyu * */ public class LuceneIndex { public static final String PATH_INDEX = "E:\\temp\\index"; public static final String PATH_FILE = "E:\\temp\\document"; /** * 创建索引 * @throws IOException */ public void createIndex()throws IOException{ File fileSource = new File(PATH_FILE); File[] files = fileSource.listFiles(); IndexWriter indexWriter = getIndexWriter(); for (File file : files) { Document document = new Document(); document.add(new StringField("path", file.getPath(), Store.YES)); document.add(new TextField("content", getDocumentContent(file), Store.YES)); document.add(new StringField("fileName",file.getName(),Store.YES)); //System.out.println(document.get("path")); //indexWriter.addDocument(document); //避免重复建索引,暂时用文件名进行区分 indexWriter.updateDocument(new Term("fileName", file.getName()), document); } indexWriter.close(); } /** * 获取文件中的数据 * @param file * @return * @throws Exception */ public static String getDocumentContent(File file){ String content = new String(); StringBuffer sb = new StringBuffer();; try { FileInputStream fis = new FileInputStream(file); BufferedReader bfr = new BufferedReader(new InputStreamReader(fis)); String s; while((s=bfr.readLine())!=null){ sb.append(s+"\n"); } fis.close(); bfr.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } content = sb.toString(); return content; } /** * 获取IndexWriter * @return * @throws Exception */ public static IndexWriter getIndexWriter() { IndexWriter indexWriter = null; try { Directory directory = FSDirectory.open(new File(PATH_INDEX)); Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_44); IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_44, luceneAnalyzer); indexWriter = new IndexWriter(directory, indexWriterConfig); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return indexWriter; } }
PS:由于我想读取到文件中的内容,目前我是文件流吧文档中的内容取出来,再放到document中。
code2:搜索文档
package org.i94livng.lucene; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.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.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class LuceneSearch { public static List<ResultModel> search(Map<String,String> searchMap)throws IOException,ParseException{ Directory directory = FSDirectory.open(new File(LuceneIndex.PATH_INDEX)); String serachContent = searchMap.get("content"); IndexReader reader = DirectoryReader.open(directory); IndexSearcher searcher = new IndexSearcher(reader); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44); //组装查询条件 QueryParser parser = new QueryParser(Version.LUCENE_44, "content",analyzer); // 将关键字包装成Query对象 Query query = parser.parse(serachContent); //获取准确度就高的5条记录 TopDocs topDocs = searcher.search(query, 5); //获取纪律列表 ScoreDoc[]scoreDocs = topDocs.scoreDocs; //把查询出来的结果转成document 并组装到 ResultModel中 List<ResultModel> resultList = new ArrayList<ResultModel>(); for (ScoreDoc scoreDoc : scoreDocs) { ResultModel resultModel = new ResultModel(); int docId = scoreDoc.doc; Document document = searcher.doc(docId); resultModel.setFilePath(document.get("path")); resultModel.setFileContent(document.get("content")); resultModel.setFileName(document.get("fileName")); resultList.add(resultModel); } return resultList; } public static void main(String[] args)throws IOException , ParseException{ LuceneIndex index = new LuceneIndex(); index.createIndex(); Map<String,String> searchMap = new HashMap<String,String>(); //搜索文档中出现“中”的文档 searchMap.put("content", "中"); List<ResultModel> result = search(searchMap); for (ResultModel resultModel : result) { System.out.println(resultModel.toString()); } } }
code3:搜索出来的结果实体。
package org.i94livng.lucene; public class ResultModel { private String fileName; private String fileContent; private String filePath; public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public String getFileContent() { return fileContent; } public void setFileContent(String fileContent) { this.fileContent = fileContent; } public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } @Override public String toString() { return "ResultModel [fileName=" + fileName + ", fileContent=" + fileContent + ", filePath=" + filePath + "]"; } }
OK,代码就这样了,我执行main方法得到的结果如下
ResultModel [fileName=test3.txt, fileContent=中华人民共和国, filePath=E:\temp\document\test3.txt]
ResultModel [fileName=test5.txt, fileContent=中华人民共和国, filePath=E:\temp\document\test5.txt]
PS:项目代码见附件。
相关推荐
本篇文章将深入探讨Lucene的几个常见示例,包括`LuceneDemo`、`LuceneZJ`、`Lucene_HelloWorld`,帮助初学者快速理解Lucene的基本操作。 1. **Lucene_HelloWorld** 这个示例是入门Lucene的首选,它展示了如何创建...
scratch少儿编程逻辑思维游戏源码-Pyorovania.zip
scratch少儿编程逻辑思维游戏源码-弹力猫.zip
scratch少儿编程逻辑思维游戏源码-地心引力.zip
内容概要:本文介绍了一种基于金枪鱼群优化算法(TSO)和支持向量机(SVM)的混合算法模型——TSO-SVM,在多变量时间序列预测中的应用。文中详细解释了TSO-SVM的工作原理,即通过模拟金枪鱼群觅食行为来优化SVM的参数,从而提升预测性能。同时提供了具体的Matlab代码实现步骤,包括参数初始化、模型训练和预测。实验结果显示,TSO-SVM相较于传统SVM方法,显著提升了预测的准确性和稳定性,并展示了良好的泛化能力。 适合人群:对机器学习尤其是时间序列预测感兴趣的科研人员和技术开发者。 使用场景及目标:①需要进行多变量时间序列预测的研究项目;②希望利用自然启发式优化算法改善现有SVM模型效果的技术团队。 其他说明:推荐使用Libsvm工具箱配合Matlab 2018B及以上版本,仅限于Windows 64位操作系统。
内容概要:本文深入探讨了机器视觉技术,重点介绍了OpenCV和Qt在工业相机采集及图像处理中的应用。文中详细讲述了卡尺工具、找线、找圆、颜色检测、模板匹配及形状匹配等关键技术的具体实现方法,并特别强调了海康工业相机采集与基于形状的模板匹配界面的开发。此外,形状匹配算法已被封装成DLL,方便直接调用。通过实际案例和技术解析,帮助读者全面掌握机器视觉系统的构建。 适合人群:对机器视觉感兴趣的初学者、有一定编程基础的研发人员、从事工业自动化领域的工程师。 使用场景及目标:适用于希望深入了解机器视觉技术及其应用场景的专业人士,旨在提升图像处理能力,优化工业自动化流程,提高生产效率。 其他说明:文章不仅提供理论知识,还附有示例代码,便于读者动手实践并加深理解。
scratch少儿编程逻辑思维游戏源码-Billy奇妙之旅.zip
内容概要:本文详细介绍了基于模型开发(MBD)的BMS电池管理系统应用层软件模型。首先概述了BMS的核心任务,即确保电池的安全与高效运行,涉及充电、放电控制、实时监测和电池均衡管理。接着重点讨论了SUMlink电池管理系统策略模型,该模型通过收集和处理电池的数据(如电压、电流、温度),并运用多种算法(如SOC估算、SOH评估)来优化电池性能。文中还阐述了BMC CVS内部通讯协议DBC的作用,确保各模块间数据传输的准确性与效率。最后,介绍了AUTOSAR标准在BMS系统中的应用,特别是针对MPC5644A芯片的底层Build工程,提高了系统的可维护性、可扩展性和可靠性。此外,提到了INCA A2L标定文件的应用,用于配置和调整系统参数,以满足不同需求。 适合人群:从事电动汽车电池管理系统研究与开发的技术人员,尤其是对MBD方法、通信协议和AUTOSAR标准感兴趣的工程师。 使用场景及目标:适用于希望深入了解BMS系统的设计原理和技术细节的专业人士,旨在提高他们对该领域的理解和实际操作能力。 其他说明:通过对代码的具体分析,读者能够更加直观地理解BMS的工作流程及其各个组件间的协作关系。
少儿编程scratch项目源代码文件案例素材-深海困境.zip
少儿编程scratch项目源代码文件案例素材-去吧泡泡糖.zip
KEPServerEX6-6.17.269.0,最新版
scratch少儿编程逻辑思维游戏源码-第二个循环.zip
少儿编程scratch项目源代码文件案例素材-手里剑.zip
少儿编程scratch项目源代码文件案例素材-山地跳跃.zip
内容概要:本文详细介绍了Informed RRT*算法及其在机器人路径规划领域的应用。文章首先解释了该算法相较于传统RRT*算法的优势,即通过将采样范围限制在由起点和终点构成的椭圆区域内来提高搜索效率。接着,文中提供了具体的代码实现,包括椭圆采样的核心公式、路径优化的rewire步骤以及动态调整邻居半径的方法。此外,还讨论了路径队列管理和椭圆区域随路径优化动态更新的重要性。通过这些技术手段,Informed RRT*能够在找到初始路径后显著加快优化速度。 适合人群:对机器人路径规划感兴趣的科研人员、工程师及学生。 使用场景及目标:适用于需要高效路径规划的实际应用场景,如自动驾驶汽车、无人机飞行路径规划等。目标是在复杂环境中快速找到从起点到终点的最佳路径。 其他说明:建议读者在理解理论的基础上,结合提供的代码进行实验,以便更好地掌握算法的工作机制。同时,在不同环境条件下测试算法性能,观察其自适应能力。
内容概要:本文详细介绍了基于COMSOL有限元软件的变压器辐射传热数值分析方法。首先,解释了变压器内外辐射传热的基本机理,包括热量通过传导、对流和辐射的方式传递,重点在于辐射传热的作用及其数学描述。接着,逐步引导读者从零开始构建有限元仿真模型,涵盖模型参数确定、网格划分、材料属性定义、边界条件设置、传热方程设定、仿真运行及结果分析等多个步骤。最后,探讨了进一步研究的方向,如不同因素(温度、材料属性、几何形状)对辐射传热的影响,以及该模型在电力电子设备和热管理系统的潜在应用。 适合人群:电气工程专业学生、初学者和技术爱好者,尤其是对有限元仿真和变压器辐射传热感兴趣的群体。 使用场景及目标:适用于希望通过实际操作掌握有限元仿真技能的人群,旨在帮助他们理解变压器辐射传热机制并能独立完成相关仿真项目。 其他说明:本文不仅提供了理论知识,还附带了详细的视频教程和仿真模型,使学习过程更加直观易懂。
scratch少儿编程逻辑思维游戏源码-Scratch 奔跑.zip
scratch少儿编程逻辑思维游戏源码-超级马里奥兄 回放引擎.zip
少儿编程scratch项目源代码文件案例素材-你准备好了吗?.zip