今天起,着手写第二个毕业设计,也在博客上记录下来项目的成长过程,与大家共勉 ~
首先、要做一个自己的企业内部搜素引擎呢,要认识Lucene:
1、Lucene的贡献者Doug Cutting是一位自身全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的Lucene的目标是为各种中小型应用程序加入全文检索功能。2001年年底成为APACHE基金会jakarta的一个子项目。
2、Lucene是一个基于Java的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene目前是Apache Jakarta家族中的一个开元项目,也是目前最为流行的基于Java开元全文检索工具包。
下面来开始Lucene的学习:
说到Java开发,首要步骤一般搜索去官方下载对应的开发包,这里不再介绍,如果这点还做不到,就不用往下继续了。因笔者才疏学浅,自己搞不了API,这里就使用旧的 lucene-2.4.0 版本来学习。
新建一个Java项目工程,本节需要引入三个jar包 lucene-analyzers-2.4.1.jar、lucene-core-2.4.1.jar、lucene-highlighter-2.4.1.jar
import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.Token; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.standard.StandardAnalyzer; public class TestLucene { public static void main(String[] args)throws Exception{ Analyzer analyzer = new StandardAnalyzer(); //分析器 TokenStream tokenStream = analyzer.tokenStream("", new StringReader("this is first lucene project")); Token token = new Token(); while(null != tokenStream.next(token)) System.out.println(token.term()); } }
first lucene project
下面我们来看以下Lucene的核心索引类:
IndexWriter:建立索引的核心组件。使用IndexWriter可以新建一个索引并将对象文件逐一添加到索引当中,但不可以执行读取和搜索操作。
Directory:代表一个lucene索引项的位置。这是一个抽象类,其具体实现有FSDirectory和RAMDirectory。前者将索引写入硬盘,对应于真实的文件系统路径,后者将索引写入内存 ,相比于前者效率高但可用空较小。
Analyzer:对文本内容进行分析的抽象类,具体实现中有停用词切除、词干分析、大小写切换等功能。
Document:可以视为文本经过处理后所对应的对象,由多个字段组成,如路径、标题、摘要、修改日期等等。
Field:字段,对应于文本的某一部分数据,便于检索时根据结果提取。
Filed使用:
import org.apache.lucene.document.Field; public class TestField { public static void main(String[] args){ Field field = new Field("fname", "fvalue", Field.Store.YES, Field.Index.ANALYZED); } }fname、fvalue为field的名与值,后面跟两个参数指存储和索引的几种操作。
Lucene与数据库的类比
概念:
数据库 Lucene
列/字段 Field
行/记录 Document
操作:
查询(SELECT) Searcher
添加(INSERT) IndexWriter.addDocument
删除(DELETE) IndexReader.delete
修改(UPDATE) 不支持(可删除后重新添加)
系统内容实现简析:
设有两篇文章1和2
文章1的内容为:Tom lives in Guangzhou , I live in Guangzhou too .
文字2的内容为:He once lived in Shanghai .
1)关键字处理,例如:lives - live (还原)。
在Lucene中有Analyzer类完成经过上面处理后
文章1的所有关键词为:[tom] [live] [i] [live] [guangzhou]
文章2的所有关键词为:[he] [live] [shanghai]
2)倒排索引
上面的对应关系是:“文章号“对”文章中所有关键词“。倒排索引把这个关系倒过来,变成:”关键词“对”拥有该关键词的所有文章号“。
文章1,2经过倒排变成(关键词 文章号)
guangzhou 1
he 2
i 1
live 1,2
shanghai 2
tom 1
3)加上”出现频率“和”出现位置“信息后,我们的索引结构变为:
关键词 文章号 [出现频率] 出现位置
guangzhou 1 [2] 3,6
he 2 [1] 1
i 1 [1] 4
live 1 [2],2 [1] 2,5,2
shanghai 2 [1] 3
tom 1 [1]
以live这行为例我们说明一下该结构:live在文章1中出现了2词,文章2中出现了一次,他的出现位置为”2,5,2“这表示什么呢?我们需要结合文章号和出现频率来分析,文章1中出现了2词,”2,5“就表示live在文章1中出现的两个位置,文章2中出现了一次,剩下的”2“就表示live是文章2中第2个关键字。