Lucene(1)——简单的存储与查找_海澜百丈冰的博客-程序员秘密

技术标签: lucene  搜索引擎  

首先准备一些文件和所需要的jar包,我这用的是lucene4.0版本的


package cn.com.demo.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringBufferInputStream;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
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 Lucene
{
	private static Version version=Version.LUCENE_40;//lucene版本
	public static void main(String[] args)
	{
		reader();
	}
	
	public static void write(){
		IndexWriter index=null;
		try
		{
			//存储信息的硬盘路径
			//Directory directory = new RAMDirectory();创建内存directory
			Directory dire=FSDirectory.open(new File("D:\\lunece\\store"));//创建硬盘的directory
			//创建indexWrite
			IndexWriterConfig config=new IndexWriterConfig(version, new StandardAnalyzer(version));
			index=new IndexWriter(dire, config);
			
			File file=new File("D:\\lunece\\file");//需要进行检索的文件路径
			//穿件document用来存储文件信息
			Document doc=null;
			for(File fil:file.listFiles()){
				doc=new Document();
				//TextField和StringField的区别:StringField将字符串认为是一个整体,不能被切分;而TextField中的字符串可以被切分
				doc.add(new StringField("fileName", fil.getName(), Store.YES));//Store.YES进行存储
				doc.add(new StringField("filePath", fil.getPath(), Store.YES));
				doc.add(new TextField("fileContent",new FileReader(fil)));//textField内容会进行分词
				//存储到indexWrite中
				index.addDocument(doc);
			}
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}finally{
			try
			{
				index.close();
			}
			catch (IOException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public static void reader(){
		DirectoryReader reader=null;
		try
		{
			//创建directory路径,方便从这个目录中拿数据查找
			Directory dire=FSDirectory.open(new File("D:\\lunece\\store"));
			reader=DirectoryReader.open(dire);
			//创建搜索indexSeacher
			IndexSearcher seacher=new IndexSearcher(reader);
			//创建搜索query
			QueryParser paeser=new QueryParser(version, "fileContent", new StandardAnalyzer(version));
			//搜索的内容
			Query query=paeser.parse("queries ");
			//返回docs
			TopDocs docs=seacher.search(query, 10);//查询10条记录
			ScoreDoc[] scores=docs.scoreDocs;
			//遍历找到document对象
			for(ScoreDoc score:scores){
				Document doc=seacher.doc(score.doc);
				//因为content拿不到,所以我通过路径用流的方式区取获取
				File f=new File(doc.get("filePath"));
				FileReader rea=new FileReader(f);
				BufferedReader buf=new BufferedReader(rea);
				String content="";
				String st="";
				while((st=buf.readLine())!=null){
					content=content+st;
				}
				System.out.println(doc.get("fileName")+"........."+doc.get("filePath")+"........."+content);
				System.out.println(doc.get("fileContent"));
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}finally{
			try
			{
				reader.close();
			}
			catch (IOException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
拿到的结果

helloworld.txt.........D:\lunece\file\helloworld.txt.........Although Lucene provides the ability to create your own queries through its API, it also provides a rich query language through the Query Parser...
null
hellowor.txt.........D:\lunece\file\hellowor.txt.........����ɶ�ط�Although Lucene provides the ability to create your own queries through its API, it also provides a rich query language through the Query Parser...
null
helloworl.txt.........D:\lunece\file\helloworl.txt.........vdfvfvdfvfd�ǵ�Although Lucene provides the ability to create y�����������ĸ��ý�Ŀ������þ����our own queries through its API, it also provides a rich query language through the Query Parser...
null

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/haozhishang/article/details/53744627

智能推荐

Springboot中利用aop和注解实现动态数据源_李守余的博客-程序员秘密

本篇文章将介绍如何使用AOP和注解来实现动态数据源. 使用ThreadLocal存储当前线程使用的数据源的keyimport org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * 用于保存当前线程使用的数据源名称的工具类,多数据源动态切换的工具类 * @author lishouyu * @version 1.0...

C#后台调用跨域MVC服务,带Cookie验证_weixin_30326515的博客-程序员秘密

背景随着富客户端框架的盛行,以及众多优秀的前端js框架,很多情况我们会遇到跨域的问题,而js的ajax请求是不允许直接跨域访问的,当然你会说可以用JSONP等,但是由于代码洁癖,不想在前端和后台添加callback,而且很多情况你是无法控制的,需要牵连考虑太多的情况。所以我直接绕过了,每个前端应用,自带一个通用后端服务代理,该服务解决跨域问题,自动代理帮前台获取跨域的数据。如何算跨域...

iOS11、iPhone X、Xcode9 适配_masony safe_liukaili_666888999的博客-程序员秘密

一、单纯升级iOS11后造成的变化1. 升级后,发现某个拥有tableView的界面错乱,组间距和contentInset错乱,因为iOS11中 UIViewController 的 automaticallyAdjustsScrollViewInsets 属性被废弃了,因此当tableView超出安全区域时,系统自动会调整SafeAreaInsets值,进而影响adjustedContentIns

用 Python 制作 NFT 区块链作品(上)_Python中文社区的博客-程序员秘密

在本文中,我们将学习如何使用 Brownie、Python 和 Chainlink 来制作非同质化的 NFT 作品,并在 OpenSea NFT 市场上展示和销售我们的成果。什么是 NFT...

Docker常用命令_docker run -id_ID-胤真的博客-程序员秘密

Docker常用命令Docker配置阿里云镜像加速sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["https://7fsjirqs.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker验证Docker的镜像加速是否生效[root@

Python学习笔记——如何运行py文件和简单变量_python怎么运行py文件_翟羽嚄的博客-程序员秘密

一、如何运行py文件?三种方式方式一:直接在cmd终端输入python然后出现>>>就可以写程序了方式二:在cmd终端输入python进入python环境然后写一个.py文件,再在终端跳入py文件的路径下输入python hello_world.py即可运行。如下如:方式三:在一些IDE里写,比如我用的pycharm...

随便推点

hyperledger fabric 实战开发——水产品溯源交易平台(一)_fabric农产品溯源项目源码_寒暄的大企鹅的博客-程序员秘密

文章目录前言环境准备水产品溯源交易平台设计实现步骤1.两个组织原始数据上传区块链,并通过couchdb查询2.两个组织原始数据再上传数据库,并通过mysql查询3.两个组织原始数据上传数据库,加密上传区块链,MySQL查询后再验证。4.实现可视化界面操作5.四个组织交易溯源平台实现虚拟机优化(根据个人喜好选择)前言在万字解析——区块链hyperledger fabric2.2部署实战教程中,我对fabric2.2官方文档的一个示例和两个实战项目进行了操作展示,现在我准备开发一个水产品溯源交易平台,在写下

(精华2020年6月4日更新)Angular基础篇 ngClass,ngStyle的使用_2b勿扰的博客-程序员秘密

<h1>属性[ngClass]</h1><!-- <div class="red">ngclass</div> --><!-- <div [class] = "{'blue':true,'red':false}">ngclass演示</div> --><div [class]="{'blue':flag,'red':!flag}">ngclass演示</div><!--

为什么阿里巴巴禁止工程师直接使用日志系统(Log4j、Logback)中的 API_Hollis Chuang的博客-程序员秘密

作为Java程序员,我想很多人都知道日志对于一个程序的重要性,尤其是Web应用。很多时候,日志可能是我们了解应用程序如何执行的唯一方式。所以,日志在Java Web应用中至关重要,但是,很多人却以为日志输出只是一件简单的事情,所以会经常忽略和日志相关的问题。在接下来的几篇文章中,我会来介绍介绍这个容易被大家忽视,但同时也容易导致故障的知识点。Java语言之所以强大,就是因为他很成熟的生态体系。...

python selenium 处理弹窗_python-selenium -- 弹出框处理_weixin_39528366的博客-程序员秘密

弹出框有两种:页面弹出框(可定位元素能操作)、Windows弹出框(不能直接定位)一、页面弹出框等待弹出框出现之后,定位弹出框,操作其中元素如:driver =webdriver.Chrome()driver.get("https://www.baidu.com")driver.maximize_window()#点击百度登录按钮driver.find_element_by_xpath('//*[...

二极管电路研究2-1_ascend__a1的博客-程序员秘密

一、二极管基本概念1.正向额定dian

Linux之shell中的大括号、中括号、小括号的使用详解+多示例_shell 大括号_keep hungry always的博客-程序员秘密

摘要:很多人和我一样对于shell的各种括号的各种用法肯定不是很清楚,有时候看见别人脚本都不知道是什么意思,今天就来说说bash中的大中小括号的用法和解释,本人常用bash所以也只能用bash来说明了,若其他shell有出入请勿怪我。一、shell中的大括号(也叫花括号) "{}"的用法:1、${var}解释:当变量名和后面的内容都是变量命名所允许的内容时候这时候直接用$var是不行的得用{}把变量名括起来2、${var:-string}解释:当变量var值为空时var:−a会吧a作为值,当变

推荐文章

热门文章

相关标签