[原创]Lucene-2.0学习文档
作者:Javafish(likunkun)
Email:javafish@sunxin.org
Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。
其功能非常的强大,api也很简单。总得来说用Lucene来进行建立
和搜索和操作数据库是差不多的(有点像),Document可以看作是
数据库的一行记录,Field可以看作是数据库的字段。用lucene实
现搜索引擎就像用JDBC实现连接数据库一样简单。
<o:p></o:p>
Lucene2.0,它与以前广泛应用和介绍的Lucene <st1:chsdate month="12" islunardate="False" day="30" year="1899" w:st="on" isrocdate="False">1.4.3</st1:chsdate>并不兼容。
<o:p></o:p>
Lucene2.0的下载地址是http://apache.justdn.org/lucene/java/
<o:p></o:p>
大家先看一个例子,通过这个例子来对lucene的一个大概的认识。<o:p></o:p>
一个Junit测试用例:(为了让代码清晰好看,我们将异常都抛出)<o:p></o:p>
a) 这是一个建立文件索引的例子<o:p></o:p>
public void testIndexHello() throws IOException<o:p></o:p>
{<o:p></o:p>
Date date1 = new Date(); <o:p></o:p>
//可以说是创建一个新的写入工具<o:p></o:p>
//第一个参数是要索引建立在哪个目录里<o:p></o:p>
//第二个参数是新建一个文本分析器,这里用的是标准的大家也可以自己写一个<o:p></o:p>
//第三个参数如果是true,在建立索引之前先将c:\\index目录清空。<o:p></o:p>
IndexWriter writer = new IndexWriter("c:\\index",new StandardAnalyzer(),true);<o:p></o:p>
<o:p></o:p>
// 这个是数据源的文件夹<o:p></o:p>
File file = new File("c:\\file");<o:p></o:p>
/**<o:p></o:p>
* 例子主要是将C:\\file目录下的文件的内容进行建立索引,将文件路径作为搜索内容的附属.<o:p></o:p>
*/<o:p></o:p>
<o:p></o:p>
if(file.isDirectory())<o:p></o:p>
{<o:p></o:p>
String[] fileList = file.list();<o:p></o:p>
for (int i = 0; i < fileList.length; i++)<o:p></o:p>
{<o:p></o:p>
// 建立一个新的文档,它可以看作是数据库的一行记录<o:p></o:p>
Document doc = new Document();<o:p></o:p>
File f = new File(file,<o:p></o:p>
fileList[i]);<o:p></o:p>
Reader reader = new BufferedReader(new FileReader(f));<o:p></o:p>
doc.add(new Field("file",reader));//为doument添加field<o:p></o:p>
doc.add(new Field("path",f.getAbsolutePath(),Field.Store.YES,Field.Index.NO));<o:p></o:p>
writer.addDocument(doc);<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
}<o:p></o:p>
writer.close();//这一步是必须的,只有这样数据才会被写入索引的目录里<o:p></o:p>
Date date2 = new Date();<o:p></o:p>
System.out.println("用时"+(date2.getTime()-date1.getTime())+"毫秒");<o:p></o:p>
}<o:p></o:p>
注意:因为建立索引本来就是费时,所以说最后输出的用时会比较长,请不要奇怪。<o:p></o:p>
b)一个通过索引来全文检索的例子<o:p></o:p>
public void HelloSearch() throws IOException, ParseException<o:p></o:p>
{<o:p></o:p>
IndexSearcher indexSearcher = new IndexSearcher("c:\\index");//和上面的IndexWriter一样是一个工具<o:p></o:p>
QueryParser queryParser = new QueryParser("file",//这是一个分词器<o:p></o:p>
new StandardAnalyzer());<o:p></o:p>
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));<o:p></o:p>
Query query = queryParser.parse(br.readLine());//这个地方Query是抽象类大家也注意一下,下面会讲到的<o:p></o:p>
Hits hits = indexSearcher.search(query);<o:p></o:p>
Document doc = null;<o:p></o:p>
System.out.print("正搜索................");<o:p></o:p>
for (int i = 0; i < hits.length(); i++)<o:p></o:p>
{<o:p></o:p>
doc = hits.doc(i);<o:p></o:p>
System.out.println("内容是:"+doc.get("file"));//注意这里输出的是什么<o:p></o:p>
System.out.println("文件的路径是:" + doc.get("path"));<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
通过上面的两个例子应该可以看出Lucene还是比较简单的。<o:p></o:p>
运行一下上面的两个例子,大家可能会说怎么doc.get(“file”);返回的是空呢,我们马上会讲到。<o:p></o:p>
下面讲一下索引的建立<o:p></o:p>
其实从上面的例子就可以看出建立索引就用到Document,IndexWriter,Field。<o:p></o:p>
最简单的步骤就是:<o:p></o:p>
首先分别new 一个Document,IndexWriter,Field<o:p></o:p>
然后用Doument.add()方法加入Field,<o:p></o:p>
其次用IndexWrtier.addDocument()方法加入Document。<o:p></o:p>
最后调用一下IndexWriter.close()方法关闭输入索引,这一步非常的重要只有调用这个方法索引才会被写入索引的目录里,而这是被很多初学的人所忽略的。<o:p></o:p>
Document没有什么好介绍的,把它的作用看成数据库中的一行记录就行。<o:p></o:p>
Field是一个比较重要的也是比较复杂的:<o:p></o:p>
看一下它的构造函数有5个:<o:p></o:p>
Field
(String name, byte[] value, Field.Store store)<o:p></o:p>
Field
(String name, Reader reader)<o:p></o:p>
Field
(String name, Reader reader, Field.TermVector termVector)<o:p></o:p>
Field
(String name, String value, Field.Store store, Field.Index index)<o:p></o:p>
Field
(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector)<o:p></o:p>
在Field中有三个内部类:Field.Index,Field.Store,Field.termVector,而构造函数也用到了它们。<o:p></o:p>
注意:
termVector
是Lucene 1.4
新增的它提供一种向量机制来进行模糊查询的这个不常用,默认是false不过是什么对于一般查询无影响。<o:p></o:p>
它们的不同的组合,在全文检索中有着不同的作用。看看下面的表吧:<o:p></o:p>
Field.Index<o:p></o:p>
|
Field.Store<o:p></o:p>
|
说明<o:p></o:p>
|
TOKENIZED( 分词) <o:p></o:p>
|
YES <o:p></o:p>
|
文章的标题或内容(如果是内容的话不能太长)是可以被搜索的<o:p></o:p>
|
TOKENIZED<o:p></o:p>
|
NO<o:p></o:p>
|
文章的标题或内容(内容可以很长)也是可以被看过的<o:p></o:p>
|
NO<o:p></o:p>
|
YES<o:p></o:p>
|
这是不能被搜索的,它只是被搜索内容的附属物。如URL等<o:p></o:p>
|
UN_TOKENIZED<o:p></o:p>
|
YES/NO<o:p></o:p>
|
不被分词,它作为一个整体被搜索,搜一部分是搜不出来的<o:p></o:p>
|
NO<o:p></o:p>
|
NO<o:p></o:p>
|
没有这种用法<o:p></o:p>
|
而对于Field
(String name, Reader reader)<o:p></o:p>
Field
(String name, Reader reader, Field.TermVector termVector)<o:p></o:p>
他们是Field.Index.TOKENIZED和Field.Store.NO的。这就是为什么我们在上面的例子中会出现文章的内容为null了。因为它只是被索引了,而并没有被存储下来。如果一定要看到文章的内容的话可以通过文章的路径得到毕竟文章的路径是作为搜索的附属物被搜索出来了。而我们在Web开发的时候一般是将大数据放在数据库中,不会放在文件系统中,更不会放在索引目录里,因为它太大了操作会加大服务器的负担。<o:p></o:p>
下面介绍一下IndexWriter:<o:p></o:p>
它就是一个写入索引的写入器,它的任务比较简单:<o:p></o:p>
1.用addDocument()将已经准备好写入索引的document们加入<o:p></o:p>
2.调用close()将索引写入索引目录<o:p></o:p>
先看一下它的构造函数:<o:p></o:p>
IndexWriter
(Directory d, Analyzer a, boolean create)
(未完)<o:p></o:p>
分享到:
相关推荐
本篇文章将围绕"Lucene-2.0学习文档"的主题,结合Indexer.java、MyScoreDocComparator.java和MySortComparatorSource.java这三个关键文件,深入探讨Lucene的核心概念和实际应用。 首先,我们来看`Indexer.java`。这...
该版本发布于2006年,虽然现在已经有了更新的版本,但Lucene 2.0仍然是许多遗留系统和学习全文检索技术的重要参考。 1. **Lucene的基本架构** Lucene的核心架构包括了索引和查询两个主要部分。索引阶段,Lucene将...
我自己根据lucene的html格式的帮助文档编译的chm
这个压缩包中的源码包含了Lucene.Net 2.0的完整开发源码,开发者可以通过阅读源码学习其内部实现,理解搜索引擎的工作原理,或者对源码进行修改和扩展,以适应特定的项目需求。由于这是一个较早的版本,可能不包含...
这个压缩包"Incubating-Apache-Lucene.Net-2.0-004-11Mar07.bin.zip"包含了Lucene.Net的2.0版本,发布于2007年3月11日,处于孵化器阶段。由于描述中提到“已编译,不含源代码”,这意味着提供的文件是编译后的二进制...
总的来说,"Lucene.Net 2.0 源码+文档"是学习和研究全文检索技术的宝贵资料,无论是对.NET开发人员还是对信息检索感兴趣的人员,都能从中获益匪浅。通过深入研究源码和文档,你可以掌握如何利用Lucene.Net构建高效...
另外,`Lucene.Net-2.0.doc.zip`文件可能包含的是关于Lucene.NET 2.0的文档资料,可能包括API参考、用户指南、示例代码等,对于学习和掌握这个版本的API非常有帮助。通过阅读这些文档,开发者可以理解如何初始化搜索...
基于Java的全文索引引擎.doc lucene测试代码.txt lucene为数据库搜索建立增量索引.txt lucene数据库索引.txt 新闻系统全文检索的思绪.txt ... 关于lucene2.0的创建、检索和删除功能的完整实现.doc weblucene.txt
**Lucene.Net 2.0 深度解析** Lucene.Net 是 Apache Lucene 的 .NET 实现,它是一个高性能、全文本搜索库,适用于 .NET 开发者。Lucene.Net 2.0 版本提供...这份 MSDN 操作文档将是学习和应用 Lucene.Net 的宝贵资源。
1. 模型与数据结构:Lucene的核心库主要包含以下组件:索引(Index)、文档(Document)、字段(Field)和分词器(Tokenizer)。索引是Lucene处理数据的主要方式,它将文本数据转化为便于搜索的结构。文档是信息的...
总结,Lucene.Net 2.0是.NET开发者实现全文检索的重要工具,它的源代码提供了丰富的学习材料,可以帮助开发者提升搜索功能的开发效率和质量。无论是在企业级应用还是个人项目中,熟悉并掌握Lucene.Net都能大大增强你...
1. **倒排索引**:倒排索引是Lucene的核心,它将每个单词映射到包含该单词的文档列表。在构建索引时,Lucene会对输入文本进行分词(Tokenization),并创建一个词项(Term)与文档ID的对应关系,极大地提高了搜索...
2006 年 6 月 1 日发布的 Lucene 2.0,其下载地址是 http://apache.justdn.org/lucene/java/。 下面通过两个示例来进一步理解 Lucene 的工作原理: **建立文件索引:** ```java public void testIndexHello() ...
同样,`lucene-2.0.CHM` 文件则提供了 Lucene 2.0 的 API 文档,尽管旧版本,但依然能为那些需要维护旧系统或对比学习的开发者提供参考。 总的来说,从 Lucene 2.0 进化到 3.0,主要变化在于性能提升、查询功能增强...
这份API文档以CHM(Compiled Help Manual)格式呈现,便于开发者快速查阅和学习。 在Lucene 2.0中,主要的知识点包括以下几个核心模块: 1. **索引模块**:这是Lucene的基础,用于构建和管理全文索引。主要包括`...
《lucene2.0+Heritrix配套源码》是一个针对搜索引擎开发的资源包,包含了构建自定义搜索引擎所需的关键组件。Lucene是一个流行的全文搜索引擎库,而Heritrix则是一个强大的网页抓取工具,用于收集互联网上的数据。这...
《Lucene 2.0及其分词工具包详解》 Lucene是一款由Apache软件基金会开发的全文搜索引擎库,专门用于信息检索。它以其强大的搜索功能和高效的性能在...尽管年代久远,Lucene 2.0仍不失为一个值得研究和学习的经典案例。
通过学习Lucene 2.0和Heritrix的相关知识,我们可以构建出一个简单的搜索引擎。首先使用Heritrix爬取目标网站的内容,然后通过Lucene 2.0对这些内容进行索引和搜索。虽然这只是一个基础框架,但它为理解搜索引擎的...
在Lucene 2.0版本中,它已经相当成熟,支持多种功能,如索引创建、查询解析、文档排序等。Lucene的核心优势在于其高效的倒排索引机制,它能够快速地查找包含特定关键词的文档。开发者可以利用Lucene API来创建索引,...