对文档建立好索引后,就可以在这些索引上面进行搜索了。搜索引擎首先会对搜索的关键词进行解析,然后再在建立好的索引上面进行查找,最终返回和用户输入的关键词相关联的文档。
创建索引:
为了对文档进行索引,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,它表示一个存储在内存当中的索引的位置。
//索引文件的存放位置
string INDEX_FILE_PATH = "C:\\wwwroot\\Test\\" + DateTime.Now.ToString("yyyyMMdd") + "_" + DateTime.Now.Ticks.ToString();
//实例化一个索引器(需要三个参数)
//1、path 索引器的存放路径
//2、Analyzer 一个分析器
//3、是否在索引目录下重新创建索引文件,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 方法加入到索引中去。这样我们便完成了索引的创建。