搜索引擎lucene(实现简单的查询效果)

lucene简介

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单方便的工具包,可以在目标系统中实现全文检索的功能Lucene是一套用于全文检索搜寻的开源程式库。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻

 

lucene突出的优点

  • (1)索引文件格式独立于应用平台。

      Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。

  • (2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。
  • (3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
  • (4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
  • (5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即可使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询、分组查询等等。

 

代码实现

    环境配置

<!--第一步就是配置maven-compiler-plugin插件-->
<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.7.0</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>


<!-- 修改web.xml由2.3至3.0 -->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="3.1">

       步骤

1、构建索引(产生索引文件)

public class IndexStarter {
	
	private static BlogDao blogDao = new BlogDao();
	
	public static void main(String[] args) {
		IndexWriterConfig conf = new IndexWriterConfig(new SmartChineseAnalyzer());
		Directory d;
		IndexWriter indexWriter = null;
		try {
			d = FSDirectory.open(Paths.get(PropertiesUtil.getValue("indexPath")));
			indexWriter = new IndexWriter(d, conf);
			
			List<Map<String, Object>> list = blogDao.list(null, null);//为所有数据库里的数据构建索引
			for (Map<String, Object> map : list) {
				Document doc = new Document();
//														Field.Store.YES是否存储到硬盘
				doc.add(new StringField("id", (String) map.get("id"), Field.Store.YES));
//				TextField 是对一句话分词处理   如java培训机构	保存则为  java  培训   机构 三个词
				doc.add(new TextField("title", (String) map.get("title"), Field.Store.YES));
				doc.add(new StringField("url", (String) map.get("url"), Field.Store.YES));
				indexWriter.addDocument(doc);
			}
			
		} catch (IOException | InstantiationException | IllegalAccessException | SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if(indexWriter != null) {
					//关闭流
					indexWriter.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

                                 配置文件信息


indexPath=D://blogCrawler/lucene


 2、读取索引文件,获取命中片段
 3、使命中文件高亮显示

SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();
				IndexReader indexReader = DirectoryReader.open(FSDirectory.open(Paths.get(PropertiesUtil.getValue("indexPath"))));
				IndexSearcher searcher = new IndexSearcher(indexReader);
				
				//拿一句话到索引目录中的索引文件进行碰撞
				Query query = new QueryParser("title", analyzer).parse(title);//对标题进行分词处理
				TopDocs topDocs = searcher.search(query, 100);//
				
				
				//高亮显示
				//将碰撞出来的关键词点亮
				QueryScorer queryScorer = new QueryScorer(query);
				//以什么形式点亮关键值
				Formatter formatter = new SimpleHTMLFormatter("<span style='color:red;'><b>", "<span><b>");
				Highlighter highlighter = new Highlighter(formatter, queryScorer);
				
				List<Map<String, Object>> blogList = new ArrayList<>();
				Map<String, Object> map = null;
				ScoreDoc[] scoreDocs = topDocs.scoreDocs;
				for (ScoreDoc scoreDoc : scoreDocs) {
//					scoreDoc 指在索引文件中查到的一条记录
					map = new HashMap<>();
					Document doc = searcher.doc(scoreDoc.doc);
					map.put("id", doc.get("id"));
					String titlehighlighter = doc.get("title");
					if(StringUtils.isNotBlank(titlehighlighter)) {
						titlehighlighter = highlighter.getBestFragment(analyzer, "title", titlehighlighter);
					}
					
					map.put("title", titlehighlighter);
					map.put("url", doc.get("url"));
					blogList.add(map);
				}
				
				request.setAttribute("blogList", blogList);

注:

      Field.Store.YES是否存储到硬盘

      以什么形式点亮关键值 Formatter formatter = new SimpleHTMLFormatter("<span style='color:red;'><b>", "<span><b>");

  

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值