`
pandong8183
  • 浏览: 57767 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

研究Lucence(Java全文搜索引擎工具包)有感

    博客分类:
  • J2EE
 
阅读更多

Lucence是Java全文搜索引擎工具包,可以提供站内全文搜索,当前是否能做成像百度一样的搜索引擎,我就不知道了

首先来看看示例,先找个感觉

http://www.cdfast.cn/

这是本人近期完成的一个购物商城的项目,顶上的搜索就是用的Lucence实现全文搜索,当前这个网站暂时还未完全启用,处于测试阶段,所有商品信息都是胡编乱造的,如有雷同,不胜荣幸

例如:输入“CCD” 或者 “CCD 彩色 防水” 试试 ^_^

 

我认为,Lucence其实就是在系统中创建了一个查询索引,你可以理解为一个磁盘文件,然后将查询时需要的信息以某种方式保存的里面,然后当用户执行查询时,直接在这个磁盘文件中查找,并将结果显示出来。

当然这是我的理解,不对之处,请批评

接下来就是实际代码

1.首先导入jar包(自己想办法下载,百度一下即可)

lucene-core-3.0.2.jar
IKAnalyzer3.2.3Stable.jar

 

2.创建索引,以下代码是在struts2 + spring中使用的查询,只看我的思路,光看代码无意义

IndexWriter indexWriter = null;
ServletContext context = (ServletContext) ActionContext.getContext().get(ServletActionContext.SERVLET_CONTEXT);
String indexUrl = context.getRealPath("/lucence/index");
File lucenceDir = new File(indexUrl);
// 如果存在直接读取,如果没有就创建
if (lucenceDir.exists()) {
	indexWriter = new IndexWriter(FSDirectory.open(lucenceDir), new IKAnalyzer(), false, IndexWriter.MaxFieldLength.LIMITED);
} else {
	indexWriter = new IndexWriter(FSDirectory.open(lucenceDir),new IKAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);
}

 

 

3.将数据库中的信息按我需要的形式添加到索引中去

Document doc = new Document();
String brandName = "";//取得品牌信息
String typeName = "";//取得类别信息

//拼接总介绍信息,将商品描述的前200个字截取出来
String summary = brandName
				+ " "
				+ typeName
				+ " "
				+ WebUtil.splitAndFilterString(product.getProductDescription(),200);
// 拼接检索内容,包含商品名称,类别名称,品牌名称,关键字,简单描述,详细描述
StringBuffer content = new StringBuffer();
content.append(product.getProductProName());
content.append(" " + brandName);
content.append(" " + typeName);
content.append(" " + product.getProductKeywords());
content.append(" " + product.getProductSimpleDescription());
content.append(" " + WebUtil.filterString(product.getProductDescription()));
doc.add(new Field("uid", product.getProductId().toString(),Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("title", product.getProductProName(),Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("summary", summary, Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(new Field("contents", content.toString(), Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field("modifyTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), Field.Store.YES,
Field.Index.NOT_ANALYZED));

 

4.最后添加到索引中

indexWriter.addDocument(doc);//将文档添加到索引中
indexWriter.optimize();//优化索引

 

5.查询索引中的信息

ServletContext context = (ServletContext) ActionContext.getContext().get(ServletActionContext.SERVLET_CONTEXT);
IndexReader reader = IndexReader.open(FSDirectory.open(new File(context.getRealPath("/lucence/index"))), true);
IndexSearcher searcher = new IndexSearcher(reader);
// 在索引器中使用IKSimilarity相似度评估器
searcher.setSimilarity(new IKSimilarity());
// 使用IKQueryParser查询分析器构造Query对象
queryString = new String(queryString.getBytes("ISO-8859-1"),"UTF-8");
Query query = IKQueryParser.parse("contents", queryString);
TopDocs hits = searcher.search(query, curPage * 20);
if (hits.totalHits > 0) {
	int offset = (curPage - 1) * 20;
	int maxLength = 0;
	if (hits.totalHits - offset > 20) {
		maxLength = 20;
		maxPage = 0;
	} else {
		maxLength = hits.totalHits - offset;
		maxPage = 1;// 设置最后一页标志
	}

	for (int i = offset; i < offset + maxLength; i++) {
		SearchBean bean = new SearchBean();
		Document doc = searcher.doc(hits.scoreDocs[i].doc);
		bean.setUid(doc.get("uid"));
		bean.setTitle(doc.get("title"));
		bean.setSummary(doc.get("summary"));
		bean.setModifyTime(doc.get("modifyTime"));
		// 为title添加链接
		bean.setTitle("<a href='/product_show.do?productId=" + bean.getUid() + "'>" + bean.getTitle().trim() + "</a>");
		// 将关键字进行着色
		queryString = queryString.trim();
		String[] keys = queryString.split(" ");
		if (keys != null && keys.length > 0) {
			for (String curKey : keys) {
				bean.setTitle(bean.getTitle().replaceAll(curKey,"<span style='color:#d90a00;font-weight: bold;'>" + curKey + "</span>"));
				bean.setSummary(bean.getSummary().replace(curKey,"<span style='color:#d90a00;font-weight: bold;'>" + curKey + "</span>"));
			}
		} else {
			bean.setTitle(bean.getTitle().replaceAll(queryString,"<span style='color:#d90a00;font-weight: bold;'>" + queryString + "</span>"));
			bean.setSummary(bean.getSummary().replace(queryString, "<span style='color:#d90a00;font-weight: bold;'>" + queryString + "</span>"));
		}
		searchList.add(bean);
	}
} else {
	searchList = null;
}

 

分享到:
评论
2 楼 pandong8183 2011-10-20  
呵呵,这里只是提供了一个思路,具体还是要你自己写哈
1 楼 tancai0118 2011-10-20  
好东西····太感谢了···

相关推荐

    基于Lucence的个性化搜索引擎研究

    为此,李晓丽和杜振龙在《基于Lucence的个性化搜索引擎研究》一文中提出了一种新的个性化搜索引擎方案。该方案通过分析用户的Cookie文件来构建用户兴趣模型,并以此指导搜索引擎提供更加精准的搜索结果。 #### 关键...

    PHP运用java的lucence搜索引擎

    Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,广泛应用于各种Java应用中。而PHP作为Web开发中的重要语言,通过特定的方式可以与Java进行交互,从而利用Lucene的强大功能。 首先,要理解PHP连接Java...

    lucence全文检索引擎

    通过提供的“lucence”压缩包,你可以深入学习Lucene的开发文档,观看视频教程,并使用提供的开发jar包进行实践操作,逐步掌握这个强大的全文检索引擎。在实际项目中,结合具体的业务需求,灵活运用Lucene的各项功能...

    apache lucence(不包含文档)

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    lucence jar.4.6.0版本所需jar包集合

    Lucence是一款开源的全文搜索引擎库,它为开发者提供了在Java应用程序中实现全文搜索功能的高级工具。这个"lucence jar.4.6.0版本所需jar包集合"是针对Lucence 4.6.0版本的一个完整依赖包集合,包含了运行和开发...

    人工智能-项目实践-搜索引擎-基于Lucence的it博客搜索引擎

    在IT行业中,搜索引擎是至关重要的工具,特别是在信息爆炸的时代,高效的信息检索能力是提升工作效率的关键。本项目实践聚焦于“人工智能-项目实践-搜索引擎-基于Lucene的IT博客搜索引擎”,这是一个利用自然语言...

    lucene+nutch开发自己的搜索引擎一书源代码

    Lucene是Java编写的一个高性能全文检索库,而Nutch则是一个开源的网络爬虫项目,它集成了Lucene进行网页索引和搜索。这份源代码提供了书中各个章节的实践示例,帮助读者深入理解这两个工具的核心功能和实际应用。 1...

    apache lucence文档

    (文档部分)Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分...

    LUCENE搜索引擎基本工作原理

    Lucene是一个开源的全文搜索引擎库,被广泛应用于构建复杂的搜索引擎系统。它的设计目标是高效、灵活且可扩展。理解Lucene的工作原理有助于开发人员更好地利用这一强大的工具。 **一、全文搜索引擎** 全文搜索引擎...

    一头扎进 lucence 视频教程 java1234出品

    《一头扎进 Lucene 视频教程》是由 Java1234 出品的专业学习资源,专注于教授 Apache Lucene 这一强大的全文搜索引擎库。Lucene 是 Java 编写的开源库,广泛应用于信息检索和大数据分析领域。本教程旨在帮助初学者及...

    lucence入门HelloWorld

    Lucene 是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、可扩展的、完全免费的搜索程序开发框架,使开发者能够轻松地在自己的应用程序中添加全文检索...

    利用开源工具搭建小型搜索引擎

    基于开源搜索引擎工具(如Heritrix +Lucence,或Nutch+Solr),搭建独立完整的搜索引擎测试平台。 2)垂直搜索行业信息:自主选择某一感兴趣行业,抓取相关行业内容。以抓取结果作为数据库,建立垂直搜索引擎,实现...

    Lucence搜索

    总结,Lucene是一个强大的搜索工具,它提供了完整的搜索解决方案,从数据采集到索引构建,再到高效的查询执行。通过“LuceneIndexDemo”,我们可以快速上手,了解并实践这些核心概念,为进一步的全文检索应用打下...

    HiGo垂直搜索引擎门户系统(基于lucence mysql asp.net) V7.3源码.rar

    HiGo垂直搜索引擎开源版系统需要独立服务器支持,也可以用你本地电脑做服务器来调试,基于lucence mysql asp.net,支持数据索引,中文分词,模糊查询,爬虫采集,精确采集规则模式和模糊采集规则模式相混合(模糊采集...

    Lius.jar能运行的lucence查看索引的小工具

    在信息技术领域,Lucene是一个广泛使用的全文搜索引擎库,由Apache软件基金会开发并维护。它提供了强大的文本分析和索引构建能力,使得开发者能够轻松地在自己的应用程序中实现搜索功能。而今天我们要探讨的是一个与...

    lucence3.6.1 示例完整包

    Lucene 是一个高性能、全文本搜索引擎库,被广泛应用于各种系统中进行文本检索。本文将深入探讨Lucene 3.6.1版本,结合“庖丁解牛”分词器以及其在数据库表索引、文件索引及分页搜索的应用,为初学者提供一套完整的...

    lucence资源

    Lucene,作为Apache软件基金会的一个开源全文检索库,是Java开发者构建高效、可扩展的信息检索应用的重要工具。本文将深入探讨Lucene在4.10及更高版本中的核心功能,包括如何建立索引、删除索引以及如何处理Office...

    Lucence和Hadoop学习资料

    Lucene是Java编写的开源全文搜索引擎库,它提供了一个高度可配置的文本分析管道,允许开发者构建自己的搜索应用。其核心功能包括文档索引、搜索、高亮显示搜索结果以及相关性评分。在《Lucence in Action》这本书中...

    lucence相关jar包 共7个

    做luence必须要的7个jar包 分别是commons-io-2.4.jar IKAnalyzer2012FF_u1.jar lucene-analyzers-common-4.10.3.jar lucene-analyzers-smartcn-4.10.3.jar lucene-core-4.10.3.jar lucene-queryparser-4.10.3.jar

Global site tag (gtag.js) - Google Analytics