- 浏览: 446921 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
Luob.:
楼主 你这个问题怎么搞定的
奇异的 Spring WebApplicationContext 自动关闭 -
u013202238:
...
PDF和Java技术(PDFBox) -
u013202238:
...
PDF和Java技术(PDFBox) -
yuan1225:
您好请问 Discuz论坛的系统设置在哪里,登陆后台后没有 ...
Discuz!论坛通行证与JSP网站的整合 -
美妙人生:
,好,太好了,只是还是不太理解!
Discuz!论坛通行证与JSP网站的整合
Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。
Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在 Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的Lucene的目标是为各种中小型应用程序加入全文检索功能。
Lucene的发展历程:早先发布在作者自己的www.lucene.com,后来发布在SourceForge,2001年年底成为APACHE基金会jakarta的一个子项目:http://jakarta.apache.org/lucene/
已经有很多Java项目都使用了Lucene作为其后台的全文索引引擎
一、开始
首先在Apache下载Lucene 2.3.0包,其中包含了核心jar和LuceneAPI文档,解压后,将 lucene-core-2.3.0.jar放在classpath中。
首先在Apache下载Lucene 2.3.0包,其中包含了核心jar和LuceneAPI文档,解压后,将 lucene-core-2.3.0.jar放在classpath中。
二、创建索引
创建索引时需要指定存放索引的目录(将来检索时需要对这个目录中的索引进行检索),和文件的目录(如果是对文件进行索引的话)代码如下:
public void crateIndex() throws Exception {
File indexDir = new File("D://luceneIndex");
File indexDir = new File("D://luceneIndex");
// 存储索引文件夹
File dataDir = new File("D://test");
// 需要检索文件夹
Analyzer luceneAnalyzer = new PaodingAnalyzer();
//PaodingAnalyzer这个类是庖丁解牛中文分词分析器类继承了Lucene的Analyzer接口,对于检索中文分词有很大帮助
File[] dataFiles = dataDir.listFiles();
boolean fileIsExist = false;
if (indexDir.listFiles().length == 0)
fileIsExist = true;
IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer, fileIsExist);
// 第三个参数是一个布尔型的变量,如果为 true 的话就代表创建一个新的索引,为 false 的话就代表在原来索引的基础上进行操作。
long startTime = new Date().getTime();
this.doIndex(dataFiles, indexWriter);
indexWriter.optimize();//优化索引
indexWriter.close();//关闭索引
long endTime = new Date().getTime();
System.out.println("It takes " + (endTime - startTime)
+ " milliseconds to create index for the files in directory " + dataDir.getPath());
{color:black}}
* private{*} void doIndex(File[] dataFiles, IndexWriter indexWriter) throws Exception {
for (int i = 0; i < dataFiles.length; i++) {
if (dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".html")) {//索引所有html格式文件
System.out.println("Indexing file " + dataFiles[i].getCanonicalPath());
Reader txtReader = new FileReader(dataFiles[i]);
Document document = new Document();
// Field.Store.YES 存储Field.Store.NO 不存储
// Field.Index.TOKENIZED 分词 Field.Index.UN_TOKENIZED 不分词
document.add(new Field("path", dataFiles[i].getCanonicalPath(), Field.Store.YES,Field.Index.UN_TOKENIZED));
document.add(new Field("filename", dataFiles[i].getName(), Field.Store.YES, Field.Index.TOKENIZED));
// 另外一个构造函数,接受一个Reader对象
document.add(new Field("contents", txtReader));
indexWriter.addDocument(document);
{color:black}} else if (dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".doc")) {//索引所有word文件
FileInputStream in = new FileInputStream(dataFiles[i]);//获得文件流
WordExtractor extractor = new WordExtractor(in);//使用POI对word文件进行解析
String str = extractor.getText();//返回String
Document document = new Document();//生成Document对象,其中有3个Field,分别是path,filename,contents
document.add(new Field("path", dataFiles[i].getCanonicalPath(), Field.Store.YES,
Field.Index.UN_TOKENIZED));
document.add(new Field("filename", dataFiles[i].getName(), Field.Store.YES, Field.Index.TOKENIZED));
// 另外一个构造函数,接受一个Reader对象
document.add(new Field("contents", str, Field.Store.YES,Field.Index.TOKENIZED,
Field.TermVector.WITH_POSITIONS_OFFSETS));
Field.TermVector.WITH_POSITIONS_OFFSETS));
indexWriter.addDocument(document);
{color:black}} else {
if (dataFiles[i].isDirectory()) {
doIndex(dataFiles[i].listFiles(), indexWriter);//使用递归,继续索引文件夹
{color:black}}
{color:black}}
{color:black}}
{color:black}}
从上面代码中可以看到对文件(或者说是数据)创建索引是一件很容易的事,首先确定需要索引的文件夹(或者数据库中的数据注:Lucene只接受数据,他不会区分数据的来源,也就是说不管是什么你只要把它转为String格式的数据,Lucene就能创建索引),然后指定创建后索引存放的地方,我们自己对数据处理后创建一个Document对象这里面你可以自己定义放几个Field,并定义Field是否进行分词什么的,这样索引就创建好了.
注:使用庖丁解牛中文分词,需要将"庖丁"中的词典(dic文件夹)放到classpath 中再把 paoding-analyzer.properties文件也放到classpath中 properties文件内容如下:
paoding.imports={color}
ifexists:classpath:paoding-analysis-default.properties;{color}
ifexists:classpath:paoding-analysis-user.properties;{color}
ifexists:classpath:paoding-knives-user.properties
ifexists:classpath:paoding-analysis-default.properties;{color}
ifexists:classpath:paoding-analysis-user.properties;{color}
ifexists:classpath:paoding-knives-user.properties
paoding.dic.home=classpath:dic
三、检索
对于创建数据的索引我们已经了解了,下面介绍一下,检索数据, 检索数据的时候我们不用关心原始的数据或者文件,我们只关心lucene生成的索引,但是要使用当初生成索引时的同一个分析器进行分析索引.
public void searchIndex() throws Exception {
String contents = "项目";//内容的关键字
String filename = "测试";//文件名的关键字
File indexDir = new File("D:
luceneIndex");//存放索引的文件夹
luceneIndex");//存放索引的文件夹
FSDirectory directory = FSDirectory.getDirectory(indexDir);
Searcher searcher = new IndexSearcher(directory);
QueryParser parserContents = new QueryParser("contents", luceneAnalyzer);
QueryParser parserFilename = new QueryParser("filename", luceneAnalyzer);
//使用同一个分析器luceneAnalyzer分别生成两个QueryParser对象
Query query1 = parserContents.parse(contents);
Query query2 = parserFilename.parse(filename);
BooleanQuery query = new BooleanQuery();
query.add(query1, BooleanClause.Occur.MUST);
query.add(query2, BooleanClause.Occur.MUST);
SimpleHTMLFormatter formatter =new SimpleHTMLFormatter("<span class=\"highlight\">","</span>");
Highlighter highlighter = new Highlighter(formatter,newQueryScorer(query));
highlighter.setTextFragmenter(newSimpleFragmenter(60));
//Lucene自带的高亮功能,在Lucene发布的bin中的lucene-2.3.0\contrib\highlighter文件夹下 lucene-highlighter-2.3.0.jar 需要导入
Hits hits = searcher.search(query);
for(int i=0;i<hits.length();i++){
TokenStream tokenStream = luceneAnalyzer.tokenStream("contents", new StringReader(hits.doc.get("contents")));
this.pageContext.getOut().println("<font style='font-size:13px'><a href='"+ hits.doc.get("path") +"'><b>"+ELFuncUtil.setStyle(hits.doc.get("filename"), filename)+"</b></a></font><br>");
String str = highlighter.getBestFragment(tokenStream,hits.doc.get("contents") + "...");
this.pageContext.getOut().println("<font style='font-size:12px'>"+str+"</font>");
this.pageContext.getOut().println("<br><hr><br>");
{color:black}}
{color:black}}
{color:black}}
<style>
.highlight {
background: yellow;
color: #CC0033;
{color:black}}
</style>
</style>
这样外界的访问直接通过Lucene去检索索引,不去触及真正的文件,效率大大提高.页面再加上一点修饰一个使用Lucene构建的搜索引擎就完成了.
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://tonyaction.blog.51cto.com/227462/62451
作者:tony_action
发表评论
-
jquery 操作checkbox的例子(全选,反选,获取选取值)
2009-05-21 17:17 5284jquery 操作checkbox的例子(全选,反选,获取选取 ... -
struts2 捕获404错误
2008-11-28 22:04 5238当访问一个不存在页面时,一般显示404错误,这是一个很不友好的 ... -
mysql alter 语句用法,添加、修改、删除字段等
2008-11-06 12:15 1608mysql alter 语句用法,添加、修改、删除字段等 / ... -
mysql数据库自动定期备份的脚本
2008-07-30 15:51 2092说明: 保留每天备份的数据是件不太现实的事,做好的做 ... -
CVS的日常使用
2008-07-22 16:50 1484一个项目的首次导入 cvs ... -
Advanced SiteMesh
2008-07-14 11:40 1180假设你打算结合多种技 ... -
Discuz! 数据库结构参考(下)
2008-06-30 09:40 3146Discuz! 数据库结构参考 ... -
Discuz! 数据库结构参考(上)
2008-06-30 09:39 2044Discuz! 数据库结构参考(上) cdb_access-- ... -
mysql 外鍵約束
2008-06-24 10:43 37191. 什么是参照完整性? ... -
mysql4.1以上版本连接时出现Client does not support authentic
2008-06-18 14:05 1270mysql4.1以上版本连接时出现Client does no ... -
Linux下两个不同版本Mysql的安装实战
2008-06-17 12:42 2814http://www.iteye.com/topic/2039 ... -
查看文本文件的编码格式
2008-06-13 17:16 3836Ubuntu enca命令可以用来查看文件的编码格式 安装 ... -
redhat9上用rpm包方式升级gcc3.2到gcc3.4
2008-06-11 09:50 4331刚刚安了个redhat9,发现gcc是3.2版本的,看到有文章 ... -
PHP+apache+mysql编程中乱码问题的解决
2008-06-10 17:20 2249作者: 乐道 2007-11 ... -
修改firefox 3的语言界面
2008-05-14 10:20 4764进入http://releases.mozilla.org/p ... -
Apache虚拟主机设置
2008-04-16 16:50 1884简介:这里说的虚拟主 ... -
Discuz!论坛通行证与JSP网站的整合
2008-04-11 16:43 5812最近做有关JSP与DISCUZ整合,搞了好久,还是搞不定,后来 ... -
PDF和Java技术(PDFBox)
2008-04-10 17:06 14754原文标题:Making PDFs Port ... -
Discuz 通行证的制作方法和详细说明
2008-04-09 17:42 2336通行证是个大题目,说白了也就是如何维护客户的会话,在php中所 ... -
JTidy 协助抽取网页内容
2008-03-26 12:18 2699使用 JTidy 协助抽取网页内容Tidy 是 W3C 用来解 ...
相关推荐
总结来说,Lucene 2.3是一个强大且灵活的Java搜索引擎开发工具包,它通过高效的索引和查询机制,结合丰富的自然语言处理能力,为Java开发者提供了构建先进搜索引擎的可能。结合Jieba Analysis,它特别适合处理中文...
首先,`lucene2.3API中文文档.chm`是针对Lucene 2.3版本的中文API文档,这为中文开发者提供了便利,帮助他们理解并使用这个版本的Lucene。在文档中,你可以找到关于Lucene核心组件的详细信息,如Analyzer(分析器)...
本文将深入探讨Lucene 2.3版本,这个版本在处理中文检索上具有显著的优势,同时也展示了Java编程语言在构建高效搜索引擎方面的强大能力。 一、Lucene简介 Lucene的核心功能包括索引和搜索,它能够快速地对大量文本...
构建搜索引擎步骤 **2.1 初始化** 首先,我们需要导入Lucene的相关库,并创建一个`Directory`对象,它可以是内存目录或磁盘上的FSDirectory,用于存储索引。 **2.2 创建Analyzer** Analyzer是处理文本的工具,它...
2 Lucene.net构建搜索引擎原理 2 2.1 全文搜索引擎 2 2.1.1 搜索引擎的分类 2 2.1.2 搜索引擎的工作原理 2 2.2 Lucene与搜索引擎 3 2.3 索引和搜索 4 2.4 Ajax技术 4 3 需求分析 5 3.1 同步环境 5 3.2功能需求 6 3.3...
接下来,我们将详细探讨这四个技术以及它们在构建搜索引擎中的应用。 **Struts2.3** 是一个基于MVC(模型-视图-控制器)设计模式的Java Web框架,用于简化Web应用开发。Struts2提供了丰富的特性,如拦截器、结果...
本文探讨了一种基于Heritrix与Lucene构建的新闻垂直搜索引擎系统。 #### 二、垂直搜索引擎的关键技术 ##### 2.1 网络爬虫(Web Crawler) 网络爬虫是垂直搜索引擎的基础组件之一,负责从互联网上抓取相关的网页...
《深入剖析Lucene.NET 2.3版:构建高效全文搜索引擎》 在IT行业中,Lucene.NET是一款备受赞誉的开源全文检索库,尤其在搜索和索引领域具有极高的地位。作为Apache软件基金会的重要项目之一,Lucene.NET是Java版...
**Lucene.Net 2.3 源码详解** Lucene.Net 是 Apache Lucene...这有助于在实际项目中实现高效、精确的全文搜索引擎。同时,研究源码也能提升对 .NET Framework 和软件工程实践的理解,特别是对于分布式系统和文档处理。
Lucene广泛应用于各种领域,如搜索引擎、企业级信息检索系统、文档管理系统等。结合其他开源项目,如Solr或Elasticsearch,可以构建更强大的全文搜索解决方案。 六、进阶话题 深入学习Lucene 2.3.0,还可以探讨...
在本文中,我们将深入探讨Lucene.Net 2.3版本的核心特性、工作原理以及如何使用它来构建高效的搜索解决方案。 **1. Lucene.Net架构** Lucene.Net基于Java版Lucene的架构,主要由以下几个核心组件构成: - **索引...
本文档主要探讨了基于Apache Lucene的索引与搜索技术,这是构建高效全文搜索引擎的关键组成部分。Lucene是一个开源的Java库,提供了强大的文本分析、索引和搜索功能,被广泛应用于各种信息检索系统中。 第一章 引言...
总之,盘古分词(PanGu4Lucene)为Lucene.NET提供了强大的中文分词支持,使开发者能够构建功能完备的中文搜索引擎。结合合适的优化策略和技术,可以实现高效、准确的中文信息检索,为用户提供更好的搜索体验。
综上所述,《高清彩版 自己动手写搜索引擎》这本书涵盖了从搜索引擎基础知识到高级技术的各个方面,适合所有希望深入了解和构建搜索引擎的人士阅读。无论是初学者还是有一定经验的技术人员,都能从中获得有价值的...
Lucene的开发手册详尽地介绍了如何使用Lucene进行搜索引擎开发,包括下载、基本概念、核心组件的使用以及性能考量。通过学习和实践,开发者可以掌握构建高效搜索引擎的技能,将Lucene融入到自己的项目中,提升搜索...
Lucene是一款高性能、全功能的文本搜索引擎库,由Java编写而成,它为开发者提供了构建搜索应用程序的基础工具。Lucene的主要特点包括: - **高度可定制性**:允许用户自定义索引和查询方式。 - **支持多种语言**:...