Lucene.net入门学习系列(2)
Lucene.net入门学习系列(3)-全文检索
在使用Lucene.net进行全文检索之前,需要写入索引,然后对索引进行检索。下面我们来看看如何建立索引。
具体步骤如下:
1.使用FSDirectory类打开一个索引文件
2.使用IndexWriter类写来写索引
3.关闭IndexWriter
1 /// <summary> 2 /// 创建索引 3 /// </summary> 4 private void CreateIndex() 5 { 6 //索引的文件存放的路径 7 string indexPath = @"Lucene"; 8 9 //FSDirectory是用于对文件系统目录的操作的类 10 FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory()); 11 //检查目录是否存在 12 bool isUpdate = IndexReader.IndexExists(directory); 13 14 if (isUpdate) 15 { 16 //目录存在则判断目录是否被锁定,被锁定就解锁 17 if (IndexWriter.IsLocked(directory)) 18 { 19 IndexWriter.Unlock(directory); 20 } 21 } 22 //IndexWriter主要用于写索引 23 //方法签名:public IndexWriter(Directory d,Analyzer a,boolean create,IndexWriter.MaxFieldLength mfl) 24 //第一个参数是 (Directory d):索引的目录(前面的FSDirectory类的对象) 25 //第二个参数是 (Analyzer a):分析器(这里我们用盘古分词的分析器) 26 //第三个参数是 (boolean create):是否创建目录 27 //第四个参数是 (IndexWriter.MaxFieldLength):最大长度 28 IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, 29 IndexWriter.MaxFieldLength.UNLIMITED); 30 31 //BLL层的一个类,用于对表T_Article进行操作 32 //T_Article表中有三个字段: Id Title Message 33 T_ArticleBLL bll = new T_ArticleBLL(); 34 35 //遍历T_Article表中的内容 36 foreach (T_Articles art in bll.GetAll()) 37 { 38 writer.DeleteDocuments(new Term("id", art.ID.ToString())); 39 40 //Document文档对象 41 Document document = new Document(); 42 43 //将T_Articles表中的内容写入索引 44 document.Add(new Field("id", art.ID.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED)); 45 46 document.Add(new Field("title", art.Title, Field.Store.YES, Field.Index.ANALYZED, 47 Field.TermVector.WITH_POSITIONS_OFFSETS)); 48 49 document.Add(new Field("msg", art.Message, Field.Store.YES, Field.Index.ANALYZED, 50 Field.TermVector.WITH_POSITIONS_OFFSETS)); 51 writer.AddDocument(document); 52 } 53 //要记得关闭 54 writer.Close(); 55 directory.Close(); 56 }
在上面的例子中,我们使用FSDirectory类来对索引文件进行操作,要注意的是索引不光可以写到文件中,索引也可以写到内存(使用RAMDirectory类)中。
索引创建好了之后,我们还可以根据需求来对索引进行不同的优化,以达到更好的检索效果。
分类: c#, Lucene.net