`
robin_liang
  • 浏览: 2434 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Lucene 3.0 学习笔记— 建立索引

阅读更多

使用lucene做为搜索引擎,主要做的2件事就是:1、建立索引;2、利用索引查询。

即lucene先将要搜索的内容,转化成一个个单词,然后对单词及其与内容的关系建索引;查询是根据你输入的内容,在索引中找到符合条件单词,并进而找到对应的内容。

这里先从创建索引开始,下面是一段代码示例:

/** 
 * Copyright (c) 2010 TeleNav, Inc 
 * All rights reserved 
 *  
 * Created on Sep 25, 2010 
 * Filename is CreateIndex.java 
 * Packagename:example 
 */  
package example;  
  
import java.io.File;  
import java.io.FileReader;  
import java.util.Date;  
  
import org.apache.lucene.analysis.standard.StandardAnalyzer;  
import org.apache.lucene.document.DateTools;  
import org.apache.lucene.document.Document;  
import org.apache.lucene.document.Field;  
import org.apache.lucene.index.IndexWriter;  
import org.apache.lucene.store.FSDirectory;  
import org.apache.lucene.util.Version;  
  
/** 
 * @author lgli 
 * 
 * Created on  Sep 25, 2010 
 */  
public class CreateIndex  
{  
    //索引文件存放目录  
    final File INDEX_DIR = new File("index");  
    //测试数据目录  
    final File docDir = new File("E:\\workspace_eclipse\\DOCTEST\\txt\\");  
      
    public boolean createIndex()  
    {  
        if (!docDir.exists() || !docDir.canRead())  
        {  
            System.out.println("Document directory '" + docDir.getAbsolutePath() + "' does not exist or is not readable, please check the path");  
            return false;  
        }  
  
        Date start = new Date();  
        try  
        {  
            IndexWriter writer = new IndexWriter(FSDirectory.open(INDEX_DIR),   
                new StandardAnalyzer(Version.LUCENE_30),   
                    true, //true为覆盖原index;false为追加  
                    IndexWriter.MaxFieldLength.LIMITED);  
            System.out.println("Indexing to directory '" + INDEX_DIR + "'...");  
            indexDocs(writer, docDir);  //创建Document,加入IndexWriter中  
            System.out.println("Optimizing...");  
            writer.optimize();          //优化索引  
            writer.close();  
  
            Date end = new Date();  
            System.out.println(end.getTime() - start.getTime() + " total milliseconds");  
  
        }  
        catch (Exception e)  
        {  
            System.out.println(e.getMessage());  
            return false;  
        }  
        return true;  
    }  
    //向IndexWriter中添加Document  
    private void indexDocs(IndexWriter writer, File file) throws Exception  
    {  
        if (file.canRead())  
        {  
            if (file.isDirectory())  
            {  
                //递归遍历目录下所有文件  
                String[] files = file.list();  
                if (files != null)  
                {  
                    for (int i = 0; i < files.length; i++)  
                    {  
                        indexDocs(writer, new File(file, files[i]));  
                    }  
                }  
            }  
            else  
            {  
                //添加Document  
                System.out.println("indexing: " + file);  
                writer.addDocument(getDocument(file));  
            }  
        }  
    }  
    public Document getDocument(File f) throws java.io.FileNotFoundException  
    {  
        //创建Document  
        Document doc = new Document();  
        doc.add(new Field("path", f.getPath(), Field.Store.YES, Field.Index.NOT_ANALYZED));  
        doc.add(new Field("modified", DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE), Field.Store.YES, Field.Index.NOT_ANALYZED));  
        doc.add(new Field("contents", new FileReader(f)));  
        return doc;  
    }  
} 

 创建索引的主要步骤:

1、先指定要搜索的文件(docDir 目录下放了一些文本文件做为测试数据)和存放索引文件的目录(INDEX_DIR )

2、创建IndexWriter-需要提供索引目录、使用的Analyzer等。Analyzer用于解析文本内容,拆分成单词,这里我使用的是lucene自带的分词器。

3、递归遍历所有文件,生成Document,每一个文件对于一个Document。

4、将Document逐个加入索引

5、关闭IndexWriter,保存索引信息



说明:

1、索引文件可存放在目录或内存中,分别使用FSDirectory和RAMDirectory

2、每个Document类似与索引中的一行记录,具体的字段由Field标识,我这里加入了3个Field,分别是路径、修改时间和内容。

3、Field中的枚举字段

     Field.Store.YES表示此字段内容需要在索引中保存

     Field.Index.NOT_ANALYZED表示此字段内容不需要做分词

     new Field("contents", new FileReader(f))表示此字段内容从reader中取,做分词但不保存





几个基本对象间的关系如下图:

最后,上面这段代码的输出结果如下:
Indexing to directory 'index'...
indexing: E:\workspace_eclipse\DOCTEST\txt\DeleteFiles.java
indexing: E:\workspace_eclipse\DOCTEST\txt\FileDocument.java
indexing: E:\workspace_eclipse\DOCTEST\txt\html\Entities.java
indexing: E:\workspace_eclipse\DOCTEST\txt\html\HTMLParser.java
indexing: E:\workspace_eclipse\DOCTEST\txt\html\HTMLParser.jj
indexing: E:\workspace_eclipse\DOCTEST\txt\html\HTMLParserConstants.java
indexing: E:\workspace_eclipse\DOCTEST\txt\html\HTMLParserTokenManager.java
indexing: E:\workspace_eclipse\DOCTEST\txt\html\ParseException.java
indexing: E:\workspace_eclipse\DOCTEST\txt\html\ParserThread.java
indexing: E:\workspace_eclipse\DOCTEST\txt\html\SimpleCharStream.java
indexing: E:\workspace_eclipse\DOCTEST\txt\html\Tags.java
indexing: E:\workspace_eclipse\DOCTEST\txt\html\Test.java
indexing: E:\workspace_eclipse\DOCTEST\txt\html\Token.java
indexing: E:\workspace_eclipse\DOCTEST\txt\html\TokenMgrError.java
indexing: E:\workspace_eclipse\DOCTEST\txt\HTMLDocument.java
indexing: E:\workspace_eclipse\DOCTEST\txt\IndexFiles.java
indexing: E:\workspace_eclipse\DOCTEST\txt\IndexHTML.java
indexing: E:\workspace_eclipse\DOCTEST\txt\SearchFiles.java
Optimizing...
734 total milliseconds

分享到:
评论
1 楼 jianwwpro 2012-02-13  
你是做搜索的吗?这方向如何?

相关推荐

    lucene3.0 lucene3.0

    lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0

    lucene3.0学习笔记(三)与paoding整合

    《Lucene 3.0 学习笔记(三)与Paoding整合》 在深入了解Lucene 3.0的过程中,我们经常会遇到如何将其与第三方工具进行整合的问题,以提升搜索性能和用户体验。这篇学习笔记主要关注的是将Lucene 3.0与Paoding搜索...

    lucene 3.0 API 中文帮助文档 chm

    lucene 3.0 API中文帮助,学习的人懂得的

    Lucene3.0之查询类型详解

    【Lucene3.0查询类型详解】 在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较...

    lucene3.0庖丁+索引搜索程序

    《深入剖析Lucene3.0:庖丁解牛与索引搜索实践》 在IT行业中,搜索引擎技术扮演着至关重要的角色,而Lucene...通过深入学习其内部工作原理,结合具体的代码实践,开发者可以更好地利用Lucene3.0解决各种信息检索问题。

    Lucene3.0创建索引

    ### Lucene3.0创建索引 在Lucene3.0中创建索引是一个关键功能,可以帮助用户快速地检索和管理大量的文本数据。本篇文章将详细介绍如何使用Lucene3.0来创建索引,并通过一个具体的例子来演示整个过程。 #### 一、...

    Lucene 3.0 原理与代码分析

    在Lucene中,这一过程包括分词、建立倒排索引和存储文档信息。分词是将文本拆分成可搜索的词语,倒排索引则是将每个词语映射到包含该词语的文档列表,以提高查询效率。 2. **Lucene的总体架构** Lucene的架构主要...

    Lucene3.0 使 用 教 程

    通过学习Lucene3.0 使用教程,开发者能够掌握全文检索的基本原理和技术,为自己的应用系统添加高效、准确的搜索功能。这不仅限于网站内部,也可以应用于桌面应用程序、帮助系统等多种场景。随着技术的深入,开发者还...

    lucene3.0核心jar包

    这里的"lucene3.0核心jar包"是 Lucene 的一个重要版本,发布于2009年,为当时的开发人员提供了构建全文搜索引擎的基础框架。 在 Lucene 3.0 中,以下几个关键知识点值得关注: 1. **索引结构**:Lucene 使用倒排...

    Lucene 3.0 原理与代码分析完整版

    通过对《Lucene 3.0 原理与代码分析完整版》的学习,开发者不仅可以理解Lucene的工作原理,还能掌握如何定制化Lucene以满足特定需求,从而在实际项目中充分利用其强大功能。这本书是深入研究和应用Lucene不可或缺的...

    lucene3.0 分词器

    lucene3.0 中文分词器, 庖丁解牛

    lucene3.0资料包

    **正文** Lucene是一个开源全文检索库,由Apache软件基金会开发。它提供了强大的文本分析、索引和搜索功能,广泛应用于各种信息检索系统...通过深入学习和应用Lucene3.0,开发者可以构建出高效、智能的信息检索系统。

    lucene3.0全文检索入门实例

    **Lucene 3.0 全文检索入门实例** Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发。...通过学习和实践这个入门实例,你将能够掌握 Lucene 3.0 的基本操作,并为你的项目添加高效的全文检索功能。

    Lucene3.0全文信息检索

    2. **多线程支持**:在3.0版本中,Lucene增强了多线程处理能力,允许在并发环境中更有效地创建和更新索引。 3. **内存管理优化**:Lucene 3.0改进了内存使用策略,降低了内存占用,同时提升了索引和搜索的性能。 4...

    lucene3.0 实例

    在 Lucene 3.0 版本中,虽然已经相对较旧,但仍然包含了基本的搜索引擎功能,适用于简单或特定场景的搜索需求。在这个实例中,我们将探讨如何在 JDK 1.5 和 Lucene 3.0 的环境下构建和运行一个简单的搜索引擎。 ...

    lucene3.0使用介绍及实例

    **正文** Lucene是一个强大的全文检索库,由Apache软件基金会开发并维护,广泛应用于各种搜索引擎...通过学习和实践,开发者可以利用Lucene 3.0的强大功能,构建出高效、灵活的全文搜索引擎,满足各种应用场景的需求。

    lucene3.0-highlighter.jar

    lucene3.0-highlighter.jar lucene3.0的高亮jar包,从lucene3.0源码中导出来的

    与lucene3.0兼容的庖丁jar包

    lucene升级了,分词也得升级哦! 在使用lucene3与paoding集成的时候可能会出现以下错误: Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysis.TokenStream.incrementToken()Z ...

    lucene 2.0 api以及lucene 3.0 api

    1. **SegmentMerger 改进**: Lucene 3.0 中,`MergePolicy` 和 `MergeScheduler` 分离,提供更灵活的索引合并策略。 2. **N-gram 查询支持**: 新增了对 N-gram 查询的支持,增强了短语查询和部分匹配的能力。 3. *...

Global site tag (gtag.js) - Google Analytics