- 浏览: 442138 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 5245jquery 操作checkbox的例子(全选,反选,获取选取 ... -
struts2 捕获404错误
2008-11-28 22:04 5173当访问一个不存在页面时,一般显示404错误,这是一个很不友好的 ... -
mysql alter 语句用法,添加、修改、删除字段等
2008-11-06 12:15 1576mysql alter 语句用法,添加、修改、删除字段等 / ... -
mysql数据库自动定期备份的脚本
2008-07-30 15:51 2056说明: 保留每天备份的数据是件不太现实的事,做好的做 ... -
CVS的日常使用
2008-07-22 16:50 1461一个项目的首次导入 cvs ... -
Advanced SiteMesh
2008-07-14 11:40 1151假设你打算结合多种技 ... -
Discuz! 数据库结构参考(下)
2008-06-30 09:40 3116Discuz! 数据库结构参考 ... -
Discuz! 数据库结构参考(上)
2008-06-30 09:39 2013Discuz! 数据库结构参考(上) cdb_access-- ... -
mysql 外鍵約束
2008-06-24 10:43 36651. 什么是参照完整性? ... -
mysql4.1以上版本连接时出现Client does not support authentic
2008-06-18 14:05 1237mysql4.1以上版本连接时出现Client does no ... -
Linux下两个不同版本Mysql的安装实战
2008-06-17 12:42 2774http://www.iteye.com/topic/2039 ... -
查看文本文件的编码格式
2008-06-13 17:16 3798Ubuntu enca命令可以用来查看文件的编码格式 安装 ... -
redhat9上用rpm包方式升级gcc3.2到gcc3.4
2008-06-11 09:50 4286刚刚安了个redhat9,发现gcc是3.2版本的,看到有文章 ... -
PHP+apache+mysql编程中乱码问题的解决
2008-06-10 17:20 2228作者: 乐道 2007-11 ... -
修改firefox 3的语言界面
2008-05-14 10:20 4732进入http://releases.mozilla.org/p ... -
Apache虚拟主机设置
2008-04-16 16:50 1852简介:这里说的虚拟主 ... -
Discuz!论坛通行证与JSP网站的整合
2008-04-11 16:43 5767最近做有关JSP与DISCUZ整合,搞了好久,还是搞不定,后来 ... -
PDF和Java技术(PDFBox)
2008-04-10 17:06 14703原文标题:Making PDFs Port ... -
Discuz 通行证的制作方法和详细说明
2008-04-09 17:42 2278通行证是个大题目,说白了也就是如何维护客户的会话,在php中所 ... -
JTidy 协助抽取网页内容
2008-03-26 12:18 2673使用 JTidy 协助抽取网页内容Tidy 是 W3C 用来解 ...
相关推荐
基于XML和Lucene构建黄页搜索引擎,姜伟,宋茂强,随着用户对搜索引擎要求的不断提高,垂直搜索引擎应运而生,成为搜索引擎新的发展趋势。论文基于开源全文索引引擎工具包Lucene,采
资源中包含lucene2.3API中文文档及lucene-3.5.0JAR包。
基于ASP.net+Ajax+Lucene的构建搜索引擎源码.zip
基于Lucene的全文搜索引擎研究与应用.pdf 详实的介绍Lucene的架构设计分析
手把手教您如何构建自己搜索引擎,从网络爬虫,C#中文分词,Lucene.net 的原理等等
lucene_heritrix 搜索引擎 很好的东西来看看吧
毕业设计:基于lucene的桌面搜索引擎
完整的《Lucene+nutch搜索引擎开发》PDF版一共83.6M,无奈我上传的最高限是80M,所以切成两个。这一个是主文件,还需要下载一个副文件Lucene+nutch搜索引擎开发.z01。解压时直接放到一起,解压这个主文件就行了。
Lucene nutch 搜索引擎开发 Part1
struts2.3 spring3.2 mybatis3.2 lucene4.2搜索引擎
基于Lucene的搜索引擎的研究与应用基于Lucene的搜索引擎的研究与应用
AJAX + Lucene 构建搜索引擎书后源代码光盘资源
licene 实例代码 nutch实例代码 lucene+nutch搜索引擎开发实例代码(王学松版)
基于lucene 的简单搜索引擎.rar
学习Lucene和Nutch的入门书籍,学习搜索引擎开发值得一看的书籍
Lucene+nutch搜索引擎开发(全本2-1),本电子书共两部分
基于Lucene的桌面搜索引擎
全文检索首先将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的目的。这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-...这是一个使用lucene开源框架编写的一个简单的搜索功能