Lucene的一个简单的标准测试(Lucene包基于3.5版本的)

2024-06-23 18:38

本文主要是介绍Lucene的一个简单的标准测试(Lucene包基于3.5版本的),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Lucene编程一般分为:索引、分词、搜索

索引源代码:

package lucene的一个标准测试;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;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.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;public class TextFileIndexer {public static void main(String[] args) throws Exception {// 需要索引的源文件位置File fileDir = new File("E:\\Lucene\\source");// 存放索引的文件位置File indexDir = new File("E:\\Lucene\\index");// 把索引建立在硬盘中Directory dir = FSDirectory.open(indexDir);// 建立一个标准分词器Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_35);//IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35,luceneAnalyzer);// 每次执行都是创建新的索引而不是追加索引iwc.setOpenMode(OpenMode.CREATE);// 创建一个索引器IndexWriter indexWriter = new IndexWriter(dir, iwc);// 保存源文件的多个文件到数组File[]中File[] textFiles = fileDir.listFiles();// 索引的开始时间long startTime = new Date().getTime();// for循环遍历源目录下的文件for (int i = 0; i < textFiles.length; i++) {if (textFiles[i].isFile()&& textFiles[i].getName().endsWith(".txt")) { // 获取相对路径???System.out.println("文件" + textFiles[i].getCanonicalPath()+ "正在被索引...");// 调用自定义读取文件内容的方法FileReaderAll()String temp = FileReaderAll(textFiles[i].getCanonicalPath(),"GBK");// 打印读取到的内容System.out.println(temp);// 为每一个文件的索引信息建立一个document对象Document document = new Document();// 文件路径索引:只是存储 不建立路径的索引,因为我们不需要对路径进行查询Field fieldPath = new Field("path", textFiles[i].getPath(),Field.Store.YES, Field.Index.NO);// 文件内容索引:Field fieldBody = new Field("body", temp, Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS);// 添加各域到document文档对象中document.add(fieldPath);document.add(fieldBody);// 将文档写入索引indexWriter.addDocument(document);}}// 关闭indexWriter.close();// 测试一下索引时间long endTime = new Date().getTime();//getPath,getAbsolutePath,getCanonicalPath的区别参考转载的文章System.out.println("用时:" + (endTime - startTime) + "毫秒来把文档增加到索引里面去,"+fileDir.getPath());System.out.println("用时:" + (endTime - startTime) + "毫秒来把文档增加到索引里面去,"+fileDir.getAbsolutePath());System.out.println("用时:" + (endTime - startTime) + "毫秒来把文档增加到索引里面去,"+fileDir.getCanonicalPath());}// 自定义读取文件内容的方法 FileReaderAll()public static String FileReaderAll(String FileName, String charset)throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(FileName), charset));//知制定读取文件方式charset:GBKString line = new String();String temp = new String();while ((line = reader.readLine()) != null) {temp += line;}reader.close();return temp;}}

搜索源代码:

package lucene的一个标准测试;import java.io.File;
import java.io.IOException;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.ParseException;
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.store.FSDirectory;
import org.apache.lucene.util.Version;public class TestQuery {public static void main(String[] args) throws IOException,ParseException{//搜索的索引路径String index = "E:\\index";IndexReader reader = IndexReader.open(FSDirectory.open(new File(index)));//定义在索引库中进行查询的searcherIndexSearcher searcher = new IndexSearcher(reader);ScoreDoc[] hits = null;//检索词String queryString="绝对秋香";//声明query对象Query query = null;//分词器Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);try {QueryParser qp = new QueryParser(Version.LUCENE_35,"body",analyzer);query = qp.parse(queryString);} catch (ParseException e) {e.printStackTrace();}if(searcher!=null){TopDocs results = searcher.search(query, 10);hits = results.scoreDocs;if(hits.length>0){System.out.println("找到hits.length="+hits.length+"个结果\n"+"找到results.totalHits="+results.totalHits);}searcher.close();}}}


这篇关于Lucene的一个简单的标准测试(Lucene包基于3.5版本的)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087963

相关文章

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程