金色坐标

关注互联网应用和搜索引擎技术

« 域名A记录修改等待生效Lucene使用代码实例之搜索文档 »

Lucene使用代码实例之建立索引

Lucene是一个基于Java的全文索引工具包,Lucene早先发布在作者自己的www.lucene.com网站,后来发布在SourceForge,2001年年底成为APACHE基金会jakarta的一个子项目:http://lucene.apache.org/,其中Eclipse和Nutch等的实现中都使用了Lucene。

Lucene虽然不是一个完整的搜索应用程序,但是它可以为你的应用程序提供索引和搜索功能。Lucene 能够为文本类型的数据建立索引,因此只要把需要索引的数据格式转化为文本格式,Lucene就可以对其进行索引和搜索。

例如需要对一些HTML文档,PDF文档或者数据库文本数据进行索引的话,首先需要把HTML文档,PDF文档等转化成文本格式内容,然后将转化后的内容交给Lucene进行索引,再把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。

如上所述,在应用实例中,使用Lucene的代码简单来说可以分为两个部分,一是建立索引,二是搜索内容。首先下载Lucene软件包,其发布形式是一个Jar文件,其中在为文档建立索引时主要会用到Document, Field, IndexWriter, Analyzer, Directory等五个基础类:

1,Document类:用来描述文档,这里的文档可以指一个HTML页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个Field对象组成的。可以把一个Document对象想象成数据库中的一个记录,而每个Field对象就是记录的一个字段。

2,Field类:用来描述一个文档的某个属性,比如一封电子邮件的标题和内容可以用两个Field对象分别描述。

3,Analyzer类:用来对文档内容进行分词处理,Analyzer 类是一个抽象类,它有多个实现,针对不同的语言和应用需要选择适合的Analyzer,Analyzer会把分词后的内容交给IndexWriter来建立索引。

4,IndexWriter类:用来创建索引的一个核心类,作用是把一个个的Document对象加到索引中来。

5,Directory类:用来描述路径和目录结构,主要用于表示Lucene建立索引的存储位置。这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,表示一个存储在文件系统中的索引的位置;第二个是RAMDirectory,表示一个存储在内存当中的索引的位置。

代码:为文本文件建立索引

package TestLucene;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.util.Date;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
/**
 * This class demonstrate the process of creating index with Lucene
 * for text files
 */
public class TxtFileIndexer {
    public static void main(String[] args) throws Exception{
        //indexDir is the directory that hosts Lucene's index files
        File   indexDir = new File("D:\\luceneIndex");
        //dataDir is the directory that hosts the text files that to be indexed
        File   dataDir  = new File("D:\\luceneData");
        Analyzer luceneAnalyzer = new StandardAnalyzer();
        File[] dataFiles  = dataDir.listFiles();
        IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);
        long startTime = new Date().getTime();
        for(int i = 0; i < dataFiles.length; i++){
            if(dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")){
                System.out.println("Indexing file " + dataFiles[i].getCanonicalPath());
                Document document = new Document();
                Reader txtReader = new FileReader(dataFiles[i]);
                document.add(Field.Text("path",dataFiles[i].getCanonicalPath()));
                document.add(Field.Text("contents",txtReader));
                indexWriter.addDocument(document);
            }
        }
        indexWriter.optimize();
        indexWriter.close();
        long endTime = new Date().getTime();
       
        System.out.println("It takes " + (endTime - startTime)
                           + " milliseconds to create index for the files in directory "
                           + dataDir.getPath());       
    }
}


在代码中,类IndexWriter的构造函数需要三个参数:

第一个参数指定了所创建的索引要存放的位置,它可以是一个File对象,也可以是一个FSDirectory对象或者 RAMDirectory 对象;

第二个参数指定了Analyzer类的一个实现,也就是指定这个索引是用哪个分词器对文挡内容进行分词;

第三个参数是一个布尔型的变量,如果为true的话就代表创建一个新的索引,为false的话就代表在原来索引的基础上进行操作。

接着程序遍历了dataDir目录下面的所有文本文档,并为每一个文本文档创建了一个Document对象。然后把文本文档的两个属性:路径和内容加入到了两个Field对象中,接着在把这两个Field对象加入到Document对象中,最后把这个文档用IndexWriter类的add方法加入到索引中去。

这样实际上便完成了对文本文件索引的创建,接下来就可以利用索引进行所需内容的搜索了。




原创文章,如转载请注明:转载自金色坐标 [ http://www.kingxy.com/ ]

本文链接地址:http://www.kingxy.com/archives/87.html
  • 相关文章:
  • quote 1.ugo
  • Field.Text不存在!!Field中没有Text这个方法!!
    52se 于 2009-6-15 9:17:31 回复
    注意下lucene的版本,新旧会有所区别
  • 2009-6-14 22:33:23 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

订阅博客

  • 订阅我的博客:订阅我的博客
  • 通过Google订阅本站
  • 通过bloglines订阅本站
  • 通过抓虾订阅本站
  • 通过yahoo订阅本站

Search

Google

最新评论及回复

最近发表

金色坐标博客——京ICP备09009094号

本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议.
KingXY Blog - This site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.