lucene项目实战【一】

Lucene应用实战(一)——索引创建与搜索 Lucene简介 Lucene是非常优秀的成熟的开源的免费的纯java语言的全文索引检索工具包。 Lucene是一个高性能、可伸缩的信息搜索(IR)库。 Information Retrieval (IR) library.它可以为你的应用程序添加索引和搜索能力。 Lucene是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者 是以此为基础建立起完整的全文检索引擎。由Apache软件基金会支持和提供,Lucene提供了一个简单却强 大的应用程序接口,能够做全文索引和搜索。 阅读详情

一、添加支持的jar包

pom.xml
<!-- 添加lucene支持 -->
	<dependency>
		<groupId>org.apache.lucene</groupId>
		<artifactId>lucene-core</artifactId>
		<version>5.3.1</version>
	  </dependency>
	  
	  <dependency>
		<groupId>org.apache.lucene</groupId>
		<artifactId>lucene-analyzers-common</artifactId>
		<version>5.3.1</version>
	 </dependency>
	 
	 <dependency>
		<groupId>org.apache.lucene</groupId>
		<artifactId>lucene-analyzers-smartcn</artifactId>
		<version>5.3.1</version>
	</dependency>
	 
	 
	 <dependency>
		<groupId>org.apache.lucene</groupId>
		<artifactId>lucene-queryparser</artifactId>
		<version>5.3.1</version>
	 </dependency>
	 
	 <dependency>
		<groupId>org.apache.lucene</groupId>
		<artifactId>lucene-highlighter</artifactId>
		<version>5.3.1</version>
	</dependency>
二、代码编写
package cn.sp.lucene;

import java.io.StringReader;
import java.nio.file.Paths;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.lang.StringEscapeUtils;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
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.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.search.highlight.SimpleSpanFragmenter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

import cn.sp.entity.Blog;
import cn.sp.util.DateUtil;
import cn.sp.util.StringUtil;

/**
 * 博客Lucene索引类
 * @author 2YSP
 *
 */
public class BlogIndex2 {

	private  Directory dir;
	
	/**
	 * 获取indexWriter实例
	 * @return
	 * @throws Exception
	 */
	public  IndexWriter getWriter() throws Exception{
		//词典保存目录
		 dir = FSDirectory.open(Paths.get("D:\\lucene"));
		 //分词器
		 SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();
		 IndexWriterConfig config = new IndexWriterConfig(analyzer);
		 IndexWriter indexWriter = new IndexWriter(dir, config);
		 return indexWriter;
	}
	
	/**
	 * 添加博客索引
	 * @param blog
	 * @throws Exception 
	 */
	public void addIndex(Blog blog) throws Exception{
		//获取writer对象
		IndexWriter writer = getWriter();
		//文档对象
		Document doc = new Document();
		//参数1.相当于key  2.值     3.是否保存
		//主键
		doc.add(new StringField("id", String.valueOf(blog.getId()), Store.YES));
		//博客标题
		doc.add(new TextField("title", blog.getTitle(), Store.YES));//保存索引
		//博客内容,不包含html标签的纯文本
		doc.add(new TextField("content", blog.getContentNoTag(), Store.YES));
		//发布日期
		doc.add(new StringField("releaseDate", blog.getReleaseDateStr(), Store.YES));
		
		//添加
		writer.addDocument(doc);
		//关闭资源
		writer.close();
	}
	/**
	 * 删除索引
	 * @param id
	 */
	public void delIndex(String id)throws Exception{
		//获取writer对象
		IndexWriter writer = getWriter();
		//删除
		writer.deleteDocuments(new Term("id",id));
		//强制删除
		writer.forceMergeDeletes();
		//事物提交
		writer.commit();
		//关闭资源
		writer.close();
	}
	/**
	 * 修改索引   和添加很类似
	 * @param blog
	 */
	public void updateIndex(Blog blog)throws Exception{
		//获取writer对象
		IndexWriter writer = getWriter();
		//获取文档对象
		Document doc = new Document();
		doc.add(new StringField("id",String.valueOf(blog.getId()),Field.Store.YES));//加入索引
		doc.add(new TextField("title", blog.getTitle(), Field.Store.YES));
		doc.add(new StringField("releaseDate", DateUtil.formatDate(new Date(), "yyyy-MM-dd"), Field.Store.YES));//发布日期
		doc.add(new TextField("content", blog.getContentNoTag(),  Field.Store.YES));
		//修改,根据id更新
		writer.updateDocument(new Term("id", String.valueOf(blog.getId())), doc);
		//关闭资源
		writer.close();
	}
	/**
	 * 查询博客
	 * @param keyWord
	 * @return
	 * @throws Exception
	 */
	public List<Blog> searchBlog(String keyWord) throws Exception{
		dir = FSDirectory.open(Paths.get("D:\\lucene"));
		//获取indexReader
		IndexReader reader = DirectoryReader.open(dir);
		//搜索对象
		IndexSearcher searcher = new IndexSearcher(reader);
		//多个条件
		BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
		SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();
		
		//查询解析器
		QueryParser parser = new QueryParser("title",analyzer);
		//解析后获得查询对象
		Query query = parser.parse(keyWord);
		
		QueryParser parser2 = new QueryParser("content",analyzer);
		Query query2 = parser2.parse(keyWord);
		//封装
		booleanQuery.add(query, Occur.SHOULD);//应该发生,非必须条件
		booleanQuery.add(query2, Occur.SHOULD);
		
		//只查询前100条
		TopDocs hits = searcher.search(booleanQuery.build(), 100);
		//以标题为计分器
		QueryScorer queryScorer = new QueryScorer(query);
		Fragmenter fragmenter = new SimpleSpanFragmenter(queryScorer);
		//字体加红加粗
		SimpleHTMLFormatter htmlFormatter = new SimpleHTMLFormatter("<b><font color='red'>", "</font></b>");
		Highlighter lighter = new Highlighter(htmlFormatter, queryScorer);
		lighter.setTextFragmenter(fragmenter);
		
		List<Blog> blogList = new LinkedList<Blog>();
		for(ScoreDoc scoreDoc: hits.scoreDocs){
			Document doc = searcher.doc(scoreDoc.doc);
			//封装blog对象
			Blog blog  = new Blog();
			blog.setId(Integer.parseInt(doc.get("id")));
			blog.setReleaseDateStr(doc.get("releaseDate"));
			String title = doc.get("title");
			String content = StringEscapeUtils.escapeHtml(doc.get("content"));//去html
			
			if(title != null){
				TokenStream tokenStream = analyzer.tokenStream("title", new StringReader(title));
				String hTitle = lighter.getBestFragment(tokenStream, title);
				if(StringUtil.isEmpty(hTitle)){//没有高亮的
					blog.setTitle(title);//不含关键字的
				}else{
					blog.setTitle(hTitle);//高亮的
				}
			}
			
			if(content != null){
				TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(content));
				String hContent = lighter.getBestFragment(tokenStream, content);
				if(StringUtil.isEmpty(hContent)){
					if(content.length() > 200){
						//内容限制200
						blog.setContent(content.substring(0,200));
					}else{
						blog.setContent(content);
					}
					
				}else{
					blog.setContent(hContent);
				}
			}
			
			//添加到集合
			blogList.add(blog);
		}
		return blogList;
	}
}


【项目实战】Lucene的API介绍 Lucene 或者 solr 有什么不一样?分别何时使用?首先 Solr是基于Lucene做的,Lucene是 一套信息检索工具包,但并不包含搜索引擎系统,它包含了索引结构、读写索引工具、相关性工具、排序等功能,因此在使用Lucene时你仍需要关注搜索引擎系统,例如数据获取、解析、分词等方面的东西。而Solr的目标是 打造一款企业级的搜索引擎系统,因此它更接近于我们认识到的搜索引擎系统,它是一个搜索引擎服务,通过各种API可以让你的应用使用搜索服务,而不需要将搜索逻辑耦合在应用中。 阅读详情

相关推荐

apache Lucene4.7最全最新的jar包

apache Lucene4.7 最全最新的jar包,很实用,很方便,可以下载后直接导入项目工程中即可。

Lucene实战 ——(一)初识Lucene

Lucene介绍 Lucene的定位是,核心索引和搜索的模块,并非完整的搜索程序。 搜索程序的组件 其中阴影部分的可以由Lucene完成。 索引组件 为何需要索引操作? 假设有一个3GB大小的文本,需要找出“程序”两个字,一种最简单的方式是顺序扫描,但这种扫描明显效率很低。所以就要选中一种高效的数据结构来存储,使得查询速度达到最快,这个过程就叫做索引操作,它的输出就叫索引。 索引的流程 搜索...

CoffeJoy 373

lucene 最新版本所有jar包

包括所有的、最新的jar包(59个),lucene-analyzers-common-4.10.2,lucene-core-4.10.2等

Lucene文件检索项目实战

1、需求分析 假设有一批文档,格式有DOC、DOCX、PPT、PPTX、TXT、PDF这几种,实现一个类似百度文库的文件检索系统,需求如下。 (1)能够对文件名进行检索。 (2)能够对文件内容进行检索。 (3)能够下载检索到的文件。 (4)能够实现关键字的高亮。 2、架构设计 概括如下,文件存储系统中存放了不同类型的文件,后台通过程序提取出文件名和文件内容,使用Lucene对文件名和文件内容进行...

MrGrant.blog 1820

lucene_jar包

lucene_jar包

lucene全文检索需要jar包

lucene全文检索需要的三个jar包:lucene-analyzers-3.6.1.jar lucene-core-3.6.1.jar lucene-highlighter-3.6.1.jar

Lucene实战(一)Lucene介绍及HelloWorld运行(附Eclipse工程)

前言 Lucene是一个开源的、成熟的java检索库。

XiaoM的专栏 2160

Lucene7.0.1 中文完整Jar包 包含所有jar

Lucene7.0.1 中文完整Jar包,值得快速下载使用。非常全

Lucene 3.0 学习(一)

最近因项目需要,开始学习Lucene。先从官网上下载了相关资源(Lucene3.0.1)。然后,上网搜索相关的入门指南、学习笔记等,想直接利用前辈们的经验迅速上手,但这些文档大都是基于2.X甚至更老的版本,与新版本并不兼容(Lucene的向下兼容似乎做得不是太好)。最后,还是通过Lucene自带的demo代码的分析及修改,对Lucene有了些初步的理解。这里把自己的心得作个总结,希望会对刚刚接触Lucene的人有所帮助,也希望能够和更多的Lucene爱好者一起交流学习,共同进步。

truekof97的专栏 952

lucene jar包

包含Lucene三个jar包:Lucene3.0.3、lucene1.4,

基于电子海图的水面无人艇全局路径规划

Research and Implementation of Global Path Planning for Unmanned Surface Vehicle Based on Electronic Chart (基于电子海图的水面无人艇全局路径规划)   该论文已经在ICMIR2017会议上发表,附上springer的文献地址 Research and Implementation of Gl...

weixin_30797199的博客 1590

《从Lucene到Elasticsearch:全文检索实战》已出版!

一、前言 决定在优快云写博客的原因是想把自己解决过的问题、踩过的坑、总结出来的经验记录下来,作为编程之路的“笔记本”,同时也能给遇到同样问题的人提供参考、节省时间,写书的初衷也一样。 二、缘起 说一下写书的前因后果。中国科学院大学雁栖湖校区是很重要的一年,师资团队无可挑剔,每次上课去的稍微晚一点,300人的大教室都没有座位。对于计算机学院而言,大数据、机器学习、信息检索(搜索引擎)、算...

1.02^365=1377.41 1万+

ROS2初级面试题汇总

总结和收集了一些关于ros2的问题和解答记录

qq_57633442的博客 5555

Lucene自学之路(一)——Lucene介绍

一、Lucene介绍 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全...

互联网叫兽 1645

OpenHarmony 4.1/5.0 Beta上手:如何用ArkUI在非华为设备上开发你的第一个“鸿蒙”应用

本文详细介绍了如何在非华为设备上使用ArkUI开发OpenHarmony应用,涵盖从设备选型、环境搭建到应用部署的全流程。通过实战案例展示ArkTS语言在开源鸿蒙生态中的应用,帮助开发者突破设备限制,构建跨平台鸿蒙应用。

weixin_33704234的博客 365

OpenWrt南京电信PPPoE IPv6配置:从零搭建稳定双栈网络

本文详细指导如何在南京电信PPPoE宽带环境下,为OpenWrt路由器配置稳定的IPv6双栈网络。核心在于正确设置WAN6接口为DHCPv6客户端,并请求/60前缀,同时配置LAN口分发地址并放行防火墙关键流量,确保内网设备获得原生IPv6连接。

water的专栏 1339

Lucene实战

更新:下面的代码使用Lucene 4.0版本! Lucene大大简化了在应用中集成全文搜索的功能。但实际上Lucene十分简单,我可以在五分钟之内向你展示如何使用Lucene。 1. 建立索引 为了简单起见,我们下面为一些字符串创建内存索引: 1 2 3 4 5 6 7 8 9 10 11

Angelof7的专栏 895

2024最新指南:如何用Python批量下载Sentinel-2数据(附避坑清单)

本文提供2024年最新Python批量下载Sentinel-2遥感数据的完整指南,涵盖环境配置、API准备、核心下载流程实现及实战避坑清单。通过智能查询器、断点续传下载器等实用工具,帮助用户高效获取遥感数据,避免常见网络问题和数据完整性验证失败。

silver的专栏 618

Lucene 学习(一)Lucene介绍以及环境搭建

概述 这几天因为公司项目需要做一个文章咨询的板块。需要用的全文检索。以前没有接触过这一块。所以自己就研究了一下lucene这个搜索引擎。学了好几天也没有做笔记。现在就记录下来吧。 lucene是什么 Lucene 即全文检索,全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当用户查询的时候,根据建立的索引查找,类似于字典的检索字表查字的过程。...

qq_40990836的博客 745

ESP32与INMP441麦克风模块实现音频传输

ESP32是一款低成本、低功耗的物联网开发板,支持Wi-Fi和蓝牙双模通信,内置双核处理器,适合音频处理和实时数据传输。INMP441是一款高性能数字麦克风模块,支持I2S接口,可提供高精度音频数据采集(24-bit分辨率,64-100 dB SNR)。

走向CTO的路上... 2040

Temporal Noise Reduction(TNR)时序去噪技术解析:原理、平台实践与工程调优路径

随着高画质夜景拍照和高清视频拍摄需求的持续增长,图像传感器在低照度环境下输出信号的噪声问题日益突出。相比空间域降噪(SNR),时序去噪(Temporal Noise Reduction, TNR)利用帧间信息进行融合处理,具备更高的信噪比提升效率及更强的边缘保护能力,已成为移动影像ISP链路中的核心环节。本文系统剖析TNR的算法原理、平台实现机制与工程调试路径,并基于实际开发案例分析其在不同场景下的效果差异及调优方法,为工程师提供从理论到实操的完整路径参考。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3200

mysql lucene怎么读_Lucene:一、入门

1 Lucene简介Lucene是apache下的一个开源的全文检索引擎工具包。1.1 全文检索(Full-text Search)1.1.1 定义全文检索就是先分词创建索引,再执行搜索的过程。分词:就是将一段文字分成一个个单词全文检索就将一段文字分成一个个单词去查询数据!!!1.1.2 应用场景1.1.2.1 搜索引擎(了解)搜索引擎是一个基于全文检索、能独立运行、提供搜索服务的软件系统。1.2...

weixin_28866737的博客 1171

yocto系列讲解[实战篇]54 - 添加Qt5和生成带Qt5的SDK

为了满足读者盆友想看yocto如何添加qt5的需求,今天就开始尝试添加meta-qt5

fulinux的博客 3870

Apache Lucene Server 快速入门与实战指南

Apache Lucene Server 快速入门与实战指南 项目介绍 Apache Lucene Server 是一个基于Apache Lucene构建的高性能HTTP REST服务层,旨在简化Lucene的索引与搜索功能在分布式环境中的集成与访问。它利用RESTful API接口,提供了一种简单而高效的方式,使开发人员能够通过JSON格式轻松地对Lucene的核心以及模块化功能进行访问。本项目...

gitblog_00066的博客 472

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Lucene API详解

Lucene API详解 1.索引目录Directory Directory是一个对索引目录的一个抽象。索引目录用于存放lucene索引文件。直接根据一个文件夹地址来创建索引目录使用SimpleFSDirectory。 MMapDirectory : 针对64系统,它在维护索引库时,会结合“内存”与硬盘同步来处理索引。 SimpleFSDirectory : 传统的文件系统索引库。 RAM...

weixin_44675503的博客 950

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

从Lucene到Elasticsearch:Lucene 文件检索项目实战

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34409703的博客 362

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 使用jsoup爬取网站图片
下一篇: redis的安装和部署
2YSP
博客等级 码龄10年 12粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值