LUCENE建立索引

索引是现代搜索引擎的核心,创建索引的过程就是把源数据处理成很是方便查询的索引文件的过程。为何索引这么重要呢,试想你如今要在大量的文档中搜索含有某个关键词的文档,那么若是不创建索引的话你就须要把这些文档顺序的读入内存,而后检查这个文章中是否是含有要查找的关键词,这样的话就会耗费很是多的时间,想一想搜索引擎但是在毫秒级的时间内查找出要搜索的结果的。这就是因为创建了索引的缘由,你能够把索引想象成这样一种数据结构,他可以使你快速的随机访问存储在索引中的关键词,进而找到该关键词所关联的文档。Lucene 采用的是一种称为反向索引(inverted index)的机制。反向索引就是说咱们维护了一个词 / 短语表,对于这个表中的每一个词 / 短语,都有一个链表描述了有哪些文档包含了这个词 / 短语。这样在用户输入查询条件的时候,就能很是快的获得搜索结果。咱们将在本系列文章的第二部分详细介绍 Lucene 的索引机制,因为 Lucene 提供了简单易用的 API,因此即便读者刚开始对全文本进行索引的机制并不太了解,也能够很是容易的使用 Lucene 对你的文档实现索引。

对文档创建好索引后,就能够在这些索引上面进行搜索了。搜索引擎首先会对搜索的关键词进行解析,而后再在创建好的索引上面进行查找,最终返回和用户输入的关键词相关联的文档。 数据库

创建索引索引: 数据结构

为了对文档进行索引,Lucene 提供了五个基础的类,他们分别是 Document, Field, IndexWriter, Analyzer, Directory。下面咱们分别介绍一下这五个类的用途: 函数

Document 搜索引擎

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

Field 对象

Field 对象是用来描述一个文档的某个属性的,好比一封电子邮件的标题和内容能够用两个 Field 对象分别描述。 索引

Analyzer 内存

在一个文档被索引以前,首先须要对文档内容进行分词处理,这部分工做就是由 Analyzer 来作的。Analyzer 类是一个抽象类,它有多个实现。针对不一样的语言和应用须要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来创建索引。 文档

IndexWriter string

IndexWriter 是 Lucene 用来建立索引的一个核心的类,他的做用是把一个个的 Document 对象加到索引中来。

Directory

这个类表明了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。

         //索引文件的存放位置
            string INDEX_FILE_PATH = "C:\\wwwroot\\Test\\" + DateTime.Now.ToString("yyyyMMdd") + "_" + DateTime.Now.Ticks.ToString();
            //实例化一个索引器(须要三个参数)
            //一、path  索引器的存放路径
            //二、Analyzer  一个分析器
            //三、是否在索引目录下从新建立索引文件,false的话在原有文件上叠加
            IndexWriter indexwrite = new IndexWriter(INDEX_FILE_PATH, new StandAnalyzer(), true);
                    //Document能够看作是数据库中一条记录,field能够看作为一个字段
                    Document doc = new Document();
                    //向doc容器里添加一个field,"pkid"为field的名字,第二个参数为其值,第三个参数为是否存储,第四个参数为是否索引
                    doc.Add(new Field("pkid", “数据1”, Field.Store.YES, Field.Index.UN_TOKENIZED));//存储该field,不建立索引
                    doc.Add(new Field("title",“数据2”, Field.Store.YES, Field.Index.UN_TOKENIZED));//存储该field,不建立索引
                    doc.Add(new Field("summary", "数据1",Field.Store.YES, Field.Index.UN_TOKENIZED));//存储该field,建立索引
                    indexwrite.AddDocument(doc);


                    indexwrite.Optimize();
                    indexwrite.Close();//建立索引成功,关闭索引

         

     咱们注意到类 IndexWriter 的构造函数须要三个参数,第一个参数指定了所建立的索引要存放的位置,他能够是一个 File 对象,也能够是一个 FSDirectory 对象或者 RAMDirectory 对象。第二个参数指定了 Analyzer 类的一个实现,也就是指定这个索引是用哪一个分词器对文挡内容进行分词。第三个参数是一个布尔型的变量,若是为 true 的话就表明建立一个新的索引,为 false 的话就表明在原来索引的基础上进行操做。接着程序遍历了目录下面的全部文本文档,并为每个文本文档建立了一个 Document 对象。而后把文本文档的两个属性:路径和内容加入到了两个 Field 对象中,接着在把这两个 Field 对象加入到 Document 对象中,最后把这个文档用 IndexWriter 类的 add 方法加入到索引中去。这样咱们便完成了索引的建立。接下来咱们进入在创建好的索引上进行搜索的部分。

相关文章
相关标签/搜索