`
ywy041102
  • 浏览: 8305 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Lucene入门与使用[转]

阅读更多
Lucene入门与使用(一) [转]本文主要面向具体使用,适用于已熟悉java编程的lucene初学者。
1. Lucene的简介


1.1 Lucene 历史


org.apache.lucene包是纯java语言的全文索引检索工具包。
Lucene的作者是资深的全文索引/检索专家,最开始发布在他本人的主页上,2001年10月贡献给APACHE,成为APACHE基金jakarta的一个子项目。
目前,lucene广泛用于全文索引/检索的项目中。
lucene也被翻译成C#版本,目前发展为Lucene.Net(不过最近好象有流产的消息)。


1.2 Lucene 原理


lucene的检索算法属于索引检索,即用空间来换取时间,对需要检索的文件、字符流进行全文索引,在检索的时候对索引进行快速的检索,得到检索位置,这个位置记录检索词出现的文件路径或者某个关键词。
在使用数据库的项目中,不使用数据库进行检索的原因主要是:数据库在非精确查询的时候使用查询语言“like %keyword%”,对数据库进行查询是对所有记录遍历,并对字段进行“%keyword%”匹配,在数据库的数据庞大以及某个字段存储的数据量庞大的时候,这种遍历是致命的,它需要对所有的记录进行匹配查询。因此,lucene主要适用于文档集的全文检索,以及海量数据库的模糊检索,特别是对数据库的 xml或者大数据的字符类型。


2.Lucene的下载和配置


2.1 Lucene的下载


lucene在jakarta项目中的发布主页:http://jakarta.apache.org/lucene/docs/index.html。以下主要针对windows用户,其它用户请在上面的地址中查找相关下载。


lucene的.jar包的下载(包括.jar和一个范例demo):
http://apache.oregonstate.edu/jakarta/lucene/binaries/lucene-1.4-final.zip


lucene的源代码下载:
http://www.signal42.com/mirrors/apache/jakarta/lucene/source/lucene-1.4-final-src.zip


lucene的api地址:http://jakarta.apache.org/lucene/docs/api/index.html


本文使用lucene版本:lucene-1.4-final.jar。

2.2 lucene的配置


首先请确定你的机子已经进行了java使用环境的基本配置,即确保在某个平台下能够运行java源代码,否则请查阅相关文档进行配置。
接下来进入lucene的配置:
普通使用者:在环境变量的CLASSPATH中添加lucene的位置。比如:“D:\java \lucene-1.4-final\lucene-1.4-final.jar;”。
jbuilder使用者:在“Project”--“Project Properties”--“Required Libraries”进行添加。
Jsp使用者:也可以直接将lucene-1.4-final.jar文件放到\WEB-INF\classes下。


3. Lucene 的范例(Demo )


3.1 Demo说明


可以得到的Demo包括:lucene-demos-1.4-final、XMLIndexingDemo,lucene-demos-1.4- final中包括对普通文件和html文件的两种索引,XMLIndexingDemo针对xml文件的索引。他们的区别主要在于:对普通文件进行索引时只要对文件的全文进行索引,而针对html、xml文件时,对标签类型不能进行索引,在实现上:html、xml的索引需要额外的数据流分析器,以分析哪些内容有用哪些无用。因此,在后两者实现上,索引的时间额外开支,甚至超过索引本身时间,而检索时间没有区别。


以上Demo中,lucene-demos-1.4-final自带于lucene-1.4-final.zip中,XMLIndexingDemo的下载地址:
http://cvs.apache.org/viewcvs.cgi/jakarta-lucene-sandbox/contributions/XML-Indexing-Demo/


3.2 Demo的运行


首先将demo.jar的路径添加如环境变量的CLASSPATH中,例如:“D:\java\lucene-1.4-final\lucene-demos-1.4-final.jar;”,同时确保已经添加lucene-1.4-final.jar。


然后进行文件的全文索引,在dos控制台中,输入命令“java org.apache.lucene.demo.IndexFiles {full-path-to-lucene}/src”,后面的路径为所要进行索引的文件夹,例如:“java org.apache.lucene.demo.IndexFiles c:\test”。


接着对索引进行检索,敲入“java org.apache.lucene.demo.SearchFiles”,在提示“Query:”后输入检索词,程序将进行检索列出检索得到的结果(检索词出现的文件路径)。

其他Demo的运行请参考\docs\demo.html。
在运行Demo后请阅读Demo的源代码以便深入学习。 Lucene入门与使用(二) [转]

4.1 Lucene的索引接口


在学习索引的时候,首先需要熟悉几个接口:


4.1.1分析器Analyzer


分析器主要工作是筛选,一段文档进来以后,经过它,出去的时候只剩下那些有用的部分,其他则剔除。而这个分析器也可以自己根据需要而编写。
org.apache.lucene.analysis.Analyzer:这是一个虚构类,以下两个借口均继承它而来。


org.apache.lucene.analysis.SimpleAnalyzer:分析器,支持最简单拉丁语言。


org.apache.lucene.analysis.standard.StandardAnalyzer:标准分析器,除了拉丁语言还支持亚洲语言,并在一些匹配功能上进行完善。在这个接口中还有一个很重要的构造函数:StandardAnalyzer(String [] stopWords),可以对分析器定义一些使用词语,这不仅可以免除检索一些无用信息,而且还可以在检索中定义禁止的政治性、非法性的检索关键词。


4.1.2 IndexWriter


IndexWriter的构造函数有三种接口,针对目录Directory、文件File、文件路径String三种情况。
例如IndexWriter(String path, Analyzer a, boolean create),path为文件路径,a为分析器,create标志是否重建索引(true:建立或者覆盖已存在的索引,false:扩展已存在的索引。)
一些重要的方法:

接口名



备注

addDocument(Document doc)



索引添加一个文档

addIndexes(Directory[] dirs)



将目录中已存在索引添加到这个索引

addIndexes(IndexReader[] readers)



将提供的索引添加到这个索引

optimize()



合并索引并优化

close()



关闭


IndexWriter为了减少大量的io维护操作,在每得到一定量的索引后建立新的小索引文件(笔者测试索引批量的最小单位为10),然后再定期将它们整合到一个索引文件中,因此在索引结束时必须进行wirter. optimize(),以便将所有索引合并优化。


4.1.3 org.apache.lucene.document


以下介绍两种主要的类:
a)org.apache.lucene.document.Document:
Document文档类似数据库中的一条记录,可以由好几个字段(Field)组成,并且字段可以套用不同的类型(详细见b)。Document的几种接口:


接口名



备注

add(Field field)



添加一个字段(Field)到Document中

String get(String name)



从文档中获得一个字段对应的文本

Field getField(String name)



由字段名获得字段值

Field[] getFields(String name)



由字段名获得字段值的集


b)org.apache.lucene.document.Field
即上文所说的“字段”,它是Document的片段section。
Field的构造函数:
Field(String name, String string, boolean store, boolean index, boolean token)。
Indexed:如果字段是Indexed的,表示这个字段是可检索的。
Stored:如果字段是Stored的,表示这个字段的值可以从检索结果中得到。
Tokenized:如果一个字段是Tokenized的,表示它是有经过Analyzer转变后成为一个tokens序列,在这个转变过程tokenization中, Analyzer提取出需要进行索引的文本,而剔除一些冗余的词句(例如:a,the,they等,详见 org.apache.lucene.analysis.StopAnalyzer.ENGLISH_STOP_WORDS和 org.apache.lucene.analysis.standard.StandardAnalyzer(String[] stopWords)的API)。Token是索引时候的基本单元,代表一个被索引的词,例如一个英文单词,或者一个汉字。因此,所有包含中文的文本都必须是Tokenized的。 Lucene入门与使用(三) [转] Field的几种接口:

Name



Stored



Indexed



Tokenized



use

Keyword(String name,

String value)



Y



Y



N



date,url

Text(String name, Reader value)



N



Y



Y



short text fields:

title,subject

Text(String name, String value)



Y



Y



Y



longer text fields,

like “body”

UnIndexed(String name,

String value)



Y



N



N



UnStored(String name,

String value)



N



Y



Y






5. 利用Lucene进行检索


5.1 一段简单的检索代码



//需要捕捉IOException,ParseException异常
//处理检索条件
Query query = QueryParser.parse("入门", "text", analyzer);

//检索
Searcher searcher = new IndexSearcher("./index");//"index"指定索引文件位置
Hits hits = searcher.search(query);

//打印结果值集
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
String id = doc.get("id");
System.out.println("found " + "入门" + " on the id:" + id);
}



5.2 利用Lucene的检索接口


5.2.1 Query与QueryParser


主要使用方法:
QueryParser .parse(String query, String field, Analyzer analyzer),例如:
Query query = QueryParser.parse("入门", "text", analyzer);
"入门"为检索词, "text"为检索的字段名, analyzer为分析器


5.2.2 Hits与Searcher


Hits的主要使用接口:


接口名



备注

Doc(int n)



返回第n个的文档的所有字段

length()



返回这个集中的可用个数




6. Lucene的其他使用


6.1 Lucene 的索引修改


下面给出一段修改索引的代码,请根据Lucene的API解读:


/**
* 对已有的索引添加新的一条索引
* @param idStr String:要修改的id
* @param doc Document:要修改的值
*/
public void addIndex(String idStr, String valueStr) {
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriter writer = null;
try {
writer = new IndexWriter(indexPath, analyzer, false);
writer.mergeFactor = 2; //修正lucene 1.4.2 bug,否则不能正确反映修改

Document doc = new Document();
doc.add(Field.UnIndexed("id", idStr));//“id”为字段名,“1”为字段值
doc.add(Field.Text("text", valueStr));
writer.addDocument(doc);

writer.optimize();
writer.close();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}

/**
* 删除索引
*
* @param idStr String
*/
public void deleteIndex(String idStr) {
try {
Directory dirt = FSDirectory.getDirectory(indexPath, false);
IndexReader reader = IndexReader.open(dirt);
Term term = new Term("text", idStr);
reader.delete(term);
reader.close();
dirt.close();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}


6.2 Lucene 的检索结果排序


Lucene的排序主要是对org.apache.lucene.search.Sort的使用。Sort可以直接根据字段Field生成,也可以根据标准的SortField生成,但是作为Sort的字段,必须符合以下的条件:唯一值以及Indexed。可以对Integers, Floats, Strings三种类型排序。
对整数型的ID检索结果排序只要进行以下的简单操作:

Sort sort = new Sort("id");
Hits hits = searcher.search(query, sort);

用户还可以根据自己定义更加复杂的排序,详细请参考API。


7 总结


Lucene给java的全文索引检索带来了非常强大的力量,以上仅对Lucene进行简单的入门说明。
分享到:
评论

相关推荐

    Lucene入门与使用

    Lucene入门与使用,非常简单,适合入门

    lucene 入门

    `lucene入门小实例.txt` 文件中可能包含了一个简单的Lucene使用示例,例如: 1. 创建 `Directory` 对象,比如使用 `FSDirectory.open()` 打开一个文件系统的目录来存储索引。 2. 实例化 `Analyzer`,如使用 `...

    lucene入门小例子

    这个“lucene入门小例子”很可能是为了帮助初学者理解并掌握Lucene的基本用法而设计的一系列示例代码。 Lucene的核心概念包括索引、文档、字段和查询。首先,你需要理解索引的概念,它类似于传统数据库中的索引,但...

    lucene3.6的入门案例

    在这个入门案例中,我们将深入理解如何使用 Lucene 3.6 版本来构建基本的文本搜索引擎。 首先,我们需要了解 Lucene 的核心概念: 1. **索引(Indexing)**:Lucene 的工作始于创建索引,将文档内容转化为可搜索的...

    lucene 入门资料包

    以上是Lucene入门的基本知识和关键概念,通过深入学习和实践,你可以掌握如何利用Lucene构建强大的全文搜索引擎。记住,实践中遇到的问题往往是最好的学习资源,不断尝试和解决,你将逐渐成为Lucene的专家。

    Lucene入门学习文档

    **Lucene入门学习文档** **一、什么是Lucene** Lucene是Apache软件基金会下的一个开源全文检索库,它提供了一个高性能、可扩展的信息检索服务。Lucene最初由Doug Cutting开发,现在已经成为Java社区中事实上的标准...

    全文搜索引擎lucene入门

    **全文搜索引擎Lucene入门** 全文搜索引擎Lucene是Apache软件基金会的一个开放源代码项目,它为Java开发者提供了一个高性能、可扩展的信息检索库。Lucene以其强大的文本搜索功能和高效的索引能力,在各种需要全文...

    Lucene入门与提高.rar

    5. **评分机制**: Lucene 使用 TF-IDF(Term Frequency-Inverse Document Frequency)算法来计算文档的相关性,给出每个查询结果的评分,帮助用户找到最相关的文档。 **Lucene 实现高级搜索** 在 Lucene 中实现...

    Lucene入门demo

    这个“Lucene入门demo”将帮助我们理解如何使用 Lucene 进行基本的索引和搜索操作。 **一、Lucene 的核心概念** 1. **索引(Indexing)**: 在 Lucene 中,索引是文档内容的预处理结果,类似于数据库中的索引。通过...

    [Lucene] Lucene入门心得

    【Lucene】Lucene入门心得 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个简单的API,使得开发者可以方便地在自己的应用程序中集成全文检索功能。...

    lucene.net+完全入门教程

    通过学习这个“lucene.net+完全入门教程”,开发者可以了解如何在.NET环境中设置Lucene.Net项目,创建和管理索引,编写查询,优化搜索性能,并掌握如何处理搜索结果。教程可能涵盖从安装步骤、基本概念介绍,到实战...

    Lucene-入门

    **标题:“Lucene-入门”** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它是Java编写的一个开源项目,被广泛应用于构建搜索引擎或者在大型数据集上进行全文检索。Lucene提供了丰富的搜索...

    lucene入门指南

    **Lucene 入门指南** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发并维护。它是 Java 开发人员用来构建搜索引擎应用程序的基础工具。本指南将帮助初学者理解 Lucene 的核心概念,以及如何利用它来...

    Lucene使用lucene入门[归类].pdf

    - 使用处理后的关键词搜索索引,找到对应的Document。 - 用户从找到的Document中提取所需信息。 【核心概念】 1. **Analyzer**: Analyzer是处理字符串的关键组件,它按照特定规则将字符串拆分成有意义的词语,...

    lucene入门基础教程

    ### Lucene 入门基础教程知识点详解 #### 一、Lucene简介 - **定义**:Lucene是一款高性能、全功能的文本搜索引擎库,由Java编写而成,属于Apache项目的一部分。 - **适用场景**:适合于任何需要进行全文检索的应用...

Global site tag (gtag.js) - Google Analytics