自己动手写搜索引擎(常搜吧历程一#认识Lucene#)(Java、Lucene、hadoop)

今天起,着手写第二个毕业设计,也在博客上记录下来项目的成长过程,与大家共勉 ~


首先、要做一个自己的企业内部搜素引擎呢,要认识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个关键字。



你可能感兴趣的:(java,hadoop,Lucene)