- 浏览: 114744 次
- 来自: ...
最新评论
-
calljunny:
多谢多谢!弄了两天,找了两天了,总算在楼主这里找到真正的问题了 ...
有关SSL的问题 -
xiaolv:
String indexDir = "d:\\Tem ...
Lucene使用指南 -
linchixiong:
学习了,最近做一个练习时发现了会响应两次,现在终于知道为什么了 ...
ListSelectionListener,鼠标选中,键盘选中 -
t8500071:
神贴啊~~刚好遇到用bat执行代码时连接sqlserver出现 ...
有关SSL的问题 -
fangfan:
Jony HWong你好,我正在试验这段程序,这段程序有一个地 ...
java实现Windows资源管理器(JExplorer)
Lucene使用指南
Lucene简介
Lucene是一个基于Java的、高性能的全文检索工具包,它目前是著名的 Apache Jakarta 家族中的一个开源项目,也是目前最为流行的基于 Java 开源全文检索工具包。但它不是一个完整的搜索应用程序,而是为应用程序提供索引和搜索功能。
Lucene 是为文本类型的数据建立索引的,所以只要能把需要索引的数据格式转化的文本的,Lucene 就能对文档进行索引和搜索。比如HTML、PDF,都可以转换文本再交给Lucene进行索引。
1. Lucene环境
1.1 Lucene版本
当前版本:取当前最新版本Lucene Core 3.4.0
下载地址:http://lucene.apache.org/java/docs/index.html
linux版本: lucene-3.4.0.tgz
windows版本:lucene-3.4.0.zip
1.2 IKAnalyzer中文分词器
Lucene的分词器以接口Analyzer的形式对外提供,外部根据业务需要实现该分词器。Lucene本身提供了标准分词器StandarAnalyzer,针对英文的分词。
中文分词器现在比较成熟的是开源项目的IKAnalyzer,是针对中文的分词, 目前最新版本是IKAnalyzer3.2.8.jar
下载地址: http://code.google.com/p/ik-analyzer/downloads/list
2. Lucene和应用程序的关系
3. Lucene API使用
3.1 建立索引
为了对文档进行索引,Lucene 提供了五个基础的类,他们分别是 Document, Field, IndexWriter, Analyzer, Directory。下面我们分别介绍一下这五个类的用途:
Document
Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。
Field
Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。
Analyzer
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。
IndexWriter
IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。
Directory
这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。
使用例子
public void createIndexs() throws Exception { String indexDir = "d:\\Temp\\lucence\\indexDir"; String dataDir = "d:\\Temp\\lucence\\dataDir"; Analyzer analyzer = new IKAnalyzer(true); // 使用中文分词器 File dir = new File(dataDir); File[] files = dir.listFiles();
Directory fsDirectory = FSDirectory.open(new File(indexDir)); IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_34, analyzer); config.setOpenMode(OpenMode.CREATE_OR_APPEND); config.setMaxBufferedDocs(1000); IndexWriter indexWriter = new IndexWriter(fsDirectory, config);
for(int i = 0; i < files.length; i++) { String filePath = files[i].getAbsolutePath();
if(filePath.endsWith(".html") || filePath.endsWith(".htm")) { HTMLDocParser htmlParser = new HTMLDocParser(filePath); String path = htmlParser.getPath(); String title = htmlParser.getTitle(); Reader content = htmlParser.getContent();
Document document = new Document(); document.add(new Field("path", path, Field.Store.YES, Field.Index.NO, Field.TermVector.NO)); document.add(new Field("title", title, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); document.add(new Field("content", content, Field.TermVector.WITH_POSITIONS_OFFSETS));
indexWriter.addDocument(document); } } indexWriter.commit(); indexWriter.optimize(); indexWriter.close(); } |
3.2 搜索文档
在上面一部分中,我们已经为一个目录下的文本文档建立好了索引,现在在这个索引上进行搜索以找到包含某个关键词或短语的文档。Lucene 提供了几个基础的类来完成这个过程,它们分别是呢 IndexSearcher, Query, QueryParser,TopDocs. 下面我们分别介绍这几个类的功能。
Query
这是一个抽象类,Lucene针对不同的类型提供了不同的实现,比如 TermQuery, BooleanQuery, PrefixQuery,PhraseQuery
等
. 这个类的目的是把用户输入的查询字符串封装成 Lucene 能够识别的 Query。
QueryParser
如果不乐意去了解诸如BooleanQuery,PhraseQuery等看上去复杂的查询类型。希望的是输入一个字符串,它就能够理解用户的搜索意图,然后转换成lucene中合理的Query子类,提供给lucene进行搜索,那这个就是QueryParser。QueryParser能够根据用户的输入来进行解析,自动构建合适的Query对象。
IndexSearcher
IndexSearcher 是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个 IndexSearcher的实例在一个索引上进行操作。
TopDocs
TopDocs是用来保存搜索的结果。保存前N条得分高的记录。
使用例子
public List search(String strQuery) throws Exception { List searchResult = new ArrayList(); String indexDir = "d:\\Temp\\lucence\\indexDir"; String field = "content"; Analyzer analyzer = new IKAnalyzer(true); // 使用中文分词器
Directory fsDirectory = FSDirectory.open(new File(indexDir)); IndexSearcher indexSearcher = new IndexSearcher(fsDirectory, true);
QueryParser queryParser = new QueryParser(Version.LUCENE_34, field, analyzer); Query query = queryParser.parse(strQuery);
if (null != query && null != indexSearcher) { TopDocs hits = indexSearcher.search(query, 1000); int totalHits = hits.totalHits; int len = Math.min(1000, totalHits);
ScoreDoc[] docs = hits.scoreDocs; for (int i = 0; i < len; i++) { SearchResultBean resultBean = new SearchResultBean();
Document doc = indexSearcher.doc(docs[i].doc); resultBean.setHtmlPath(doc.get("path")); resultBean.setHtmlTitle(doc.get("title")); searchResult.add(resultBean); } } return searchResult; } |
4. 附录
提供一个简单的Lucene Demo工程。参考lucene-demo.rar。
- lucene-demo.rar (2.5 MB)
- 下载次数: 172
评论
String dataDir = "d:\\Temp\\lucence\\dataDir";
这两个地址干什么用?
地址下面还要自己建*.html的文件?
发表评论
-
【jira3.6破解版】界面中文乱码问题解决办法
2012-03-23 17:30 2977原因: jira3.6版本默认的界面字符编码为big5。 ... -
Extjs实现快捷键CTRL+TAB对Tabpanel进行Tab切换
2012-03-16 17:24 3896// 注册ctrl+tab组合键到keymap ... -
memcache及其telnet命令使用详解
2011-09-19 11:34 297851、启动Memcache 常用参数memcached 1. ... -
java序列化的一点经验
2011-08-12 22:07 4236java序列化的一点经验 半年多一来,一直碰到一个问题没有解决 ... -
Jad.exe反编译工具和jad eclipse插件
2011-01-26 16:19 3574配置jad插件 直接将net.sf.jadclipse_3 ... -
smartcare各类文档
2010-09-18 21:41 0smartcare各类文档 -
Sock Demo
2010-08-23 00:40 0Sock Demo -
实时监控方案分析
2010-08-10 02:05 0实时监控方案分析 -
数据库连接池-C3P0配置
2010-08-03 00:43 4196>>转自:http://hi.baidu.com/ ... -
Linux自动化分区
2010-07-31 22:35 0#!/bin/bash disk='/dev/hdc' e ... -
JVM调优
2010-07-19 01:06 1098JVM调优 -
LVS集群
2010-07-16 00:57 973LVS集群 -
Application Layer Gateway Service 和 FTP
2010-05-17 22:41 1785Application Layer Gateway Servi ... -
FTP - RFC959 中文版
2010-05-14 00:02 4451转自:http://www.chinaitpower.com/ ... -
网络地址转换NAT
2010-05-13 23:57 2484网络地址转换(NAT,Network Address Tran ... -
Firewall rules for FTP+SSL Explicit
2010-05-10 01:14 1277Firewall rules for FTP+SSL Expl ... -
ftp与防火墙
2010-05-10 00:54 2571下面是针对ftp与防火墙的: 原文在 https://bbs ... -
区分网上邻居
2010-03-11 01:12 893ShellFolder.get("fileChoos ... -
论FTP的主动被动和相关的防火墙设置
2009-09-08 00:32 3004FTP 分为两类: 主动FTP( ... -
SSL Handshake :Bad Record Mac
2009-07-23 00:06 7423case 1: SSL3_GET_RECORD:decryp ...
相关推荐
非常好的lucene学习资料,本人摘自多方资料整理,绝对真实!
Lucene 基础指南,学习lucene的好文档
lucene入门指南 汇集网络一些精华和自己的总结
lucene2.9开发指南是为了帮助初级开发人员而编写整理的资料,包括了所有的核心技术,希望对大家有帮助
lucene入门指南得好帮手!!!
Lucene实战(第2版)(最权威的Lucene指南,覆盖Apache Lucene 3.0,作者为Lucene项目成员) 《Lucene实战(第2版)》基于Apache的Lucene 3.0,从Lucene核心、Lucene应用、案例分析3个方面详细系统地介绍了Lucene,包括...
Lucene是一套用于全文检索和搜寻的开源程式库, 由Apache软件基金会支持和提供。Lucene提供了一个简单确强大的应用程式接口,能够做全文索引和搜寻,在Java开发环境里Lucene是一个 成熟的免费开放源代码工具;就其...
面试指南-Lucene/ES篇
描述Lucene概念,快速掌握Lucene的相关类及其作用等。
指南-Lucene:ES篇.md
### 倒排索引深入骨髓 - #### 倒排索引的原理以及它是用来解决哪些问题(谈谈你对倒排索引的理解) - #### 倒排索引底层数据结构(倒排索引...- #### FST在Lucene的读写过程(Lucene源码实现) ....................
当Lucene的第一次打五年前的场景,这是令人惊叹的。通过使用这个开源的,高度可扩展,超快速的...和第二版,字迹清晰,可重复使用的例子,和最佳做法,在行动的Lucene所无法比拟的意见,仍然是用Lucene开发的权威指南。
面试指南-Lucene_ES篇-课件.md
Struts标签Lucene中文分词构建基于词典的Lucene分析器使用Log4j进行日志记录 您使用过旅游指南吗?它总是能让我们快速的找到目的地。我对此有深刻的印象,希望这篇指南也能使您快速的完成Struts标签相关的任务。我...
clinton gormley,zachary tong著,路小磊等译!...想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是, Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
"Lucene in Action"是Lucene最权威的指南! 这本著作论述了然后索引数据,还介绍了搜索、排序、过滤以及高亮显示搜索结果等方面的内容。 本书提供的实践方面的可重用示例以及一些中肯的建议,为您展示了一个奇妙...
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索...
Elasticsearch权威指南,带完整目录。 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的...
基于J2EE的应用,使用了EJB以及JMS等技术,前台界面部分使用Struts MVC 框架,基于XML的portlet配置文件可以自由地动态扩展,使用了Web服务来支持一些远程信息的获取,使用 Lucene实现全文检索功能。 Liferay国内用...
SOLR是基于LUCENE的搜索服务器,能根据XML\XSLT\JOSN来搜索信息