Lucene4源代码分析之二:Lucene简介

Lucene4源代码分析之二:Lucene简介

Lucene是一个高性能的,可扩展的信息检索库,香港虚拟主机,能让你轻松到在自己的应用中增加全文检索功能。简单的说,Lucene就是实现了搜索引擎功能的基础库。

Lucene是一个高性能的,可扩展的信息检索库,能让你轻松到在自己的应用中增加全文检索功能。简单的说,Lucene就是实现了搜索引擎功能的基础库。搜索引擎就一个功能,根据网名输入的Query,找到相关的文档。文档成千上万上亿,直接字符串匹配顺序查找,慢的像蜗牛一样,谁都受不了,所以聪明人发明了索引(Index)。所谓索引,简单点说就是建立了一些词到一些文档的映射,能迅速的根据词找到相关的文档。所以Lucene就两个基本功能:(1)对文档建索引;(2)根据网名输入,通过索引迅速的找到相关的文档。

索引是现代搜索引擎的核心,建立索引的过程就是把源数据处理成非常方便查询的索引文件的过程。为什么索引这么重要呢,试想你现在要在大量的文档中搜索含有某个关键词的文档,那么如果不建立索引的话你就需要把这些文档顺序的读入内存,然后检查这个文章中是不是含有要查找的关键词,这样的话就会耗费非常多的时间,想想搜索引擎可是在毫秒级的时间内查找出要搜索的结果的。这就是由于建立了索引的原因,你可以把索引想象成这样一种数据结构,他能够使你快速的随机访问存储在索引中的关键词,进而找到该关键词所关联的文档。Lucene 采用的是一种称为反向索引(inverted index)的机制。反向索引就是说我们维护了一个词 / 短语表,对于这个表中的每个词 / 短语,都有一个链表描述了有哪些文档包含了这个词 / 短语。这样在用户输入查询条件的时候,就能非常快的得到搜索结果。

为了对文档进行索引,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 class IndexFiles { private IndexFiles() {}

/** Index all text files under a directory. */ public static void main(String[] args) { String usage = “java org.apache.lucene.demo.IndexFiles” + ” [-index INDEX_PATH] [-docs DOCS_PATH] [-update]\n\n” + “This indexes the documents in DOCS_PATH, creating a Lucene index” + “in INDEX_PATH that can be searched with SearchFiles”; String indexPath = “index”; String docsPath = null; boolean create = true; for(int i=0;i<args.length;i++) { //写索引的目录 if (“-index”.equals(args[i])) { indexPath = args[i+1]; i++; //需建索引的文档目录 } else if (“-docs”.equals(args[i])) { docsPath = args[i+1]; i++; //指明是更新还是新建 } else if (“-update”.equals(args[i])) { create = false; } }

if (docsPath == null) { System.err.println(“Usage: ” + usage); System.exit(1); }

final File docDir = new File(docsPath); if (!docDir.exists() || !docDir.canRead()) { System.out.println(“Document directory ‘” +docDir.getAbsolutePath()+ “‘ does not exist or is not readable, please check the path”); System.exit(1); } Date start = new Date(); try { System.out.println(“Indexing to directory ‘” + indexPath + “‘…”); //写索引的目录 Directory dir = FSDirectory.open(new File(indexPath)); //实例化一个分析器 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40); //索引Writer配置,参数为分析器 IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_40, analyzer); 在旅途中,我遇见了你,你我相识是缘分!

Lucene4源代码分析之二:Lucene简介

相关文章:

你感兴趣的文章:

标签云: