ClassRUN.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:4k
源码类别:

搜索引擎

开发平台:

C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.IO;
  5. using System.Text.RegularExpressions;
  6. using Lucene.Net.Analysis.Standard;
  7. using Lucene.Net.Documents;
  8. using Lucene.Net.Index;
  9. /*
  10.       '       迅龙中文分类搜索引擎  v0.6
  11.       '
  12.       '        LGPL  许可发行
  13.       '
  14.       '       宁夏大学  张冬 康彩  zd4004@163.com
  15.       ' 
  16.       '        官网 http://blog.163.com/zd4004/
  17.  */
  18. namespace XunLong.IndexBuilder
  19. {
  20.     public class ClassRUN
  21.     {
  22.         //索引写入器
  23.         private IndexWriter writer;
  24.         //要写入索引的文件的根目录
  25.         private string docRootDirectory;
  26.         //要匹配的文件格式
  27.         private string pattern;
  28.         /// <summary>
  29.         /// 初始化一个索引写入器writer,directory为创建索引的目录,true代表如果不存在索引文件将重新创建索引文件,如果已经存在索引文件将覆写索引文件,如果为true将代表打开已经存在的索引文件
  30.         /// </summary>
  31.         /// <param name="directory">传入的要创建索引的目录,注意是字符串值,如果目录不存在,他将会被自动创建</param>
  32.         public ClassRUN(string directory)
  33.         {
  34.             writer = new IndexWriter(directory, new StandardAnalyzer(), true);
  35.             writer.SetUseCompoundFile(true);
  36.         }
  37.         public void AddDirection(DirectoryInfo directory, string pattern)
  38.         {
  39.             this.pattern = pattern;
  40.             this.docRootDirectory = directory.FullName;
  41.             AddSubDirectory(directory);
  42.         }
  43.         private void AddSubDirectory(DirectoryInfo directory)
  44.         {
  45.             foreach (FileInfo fi in directory.GetFiles(pattern))
  46.             {
  47.                 //遍历要写入索引的目录的所有文件,把他先加入Docuemnt对象,再加入索引,因为索引都是有Document对象组成
  48.                 AddHtmlToDocument(fi.FullName);
  49.             }
  50.             foreach (DirectoryInfo di in directory.GetDirectories())
  51.             {
  52.                 //层层遍历递归,只到把所有的子目录子文件都搞完
  53.                 AddSubDirectory(di);
  54.             }
  55.         }
  56.         private void AddHtmlToDocument(string path)
  57.         {
  58.             Document doc = new Document();
  59.             string html;
  60.             using (StreamReader sr = new StreamReader(path, System.Text.Encoding.Default))
  61.             {
  62.                 html = sr.ReadToEnd();
  63.             }
  64.             int relativePathStartsAt = this.docRootDirectory.EndsWith("\") ? this.docRootDirectory.Length : this.docRootDirectory.Length + 1;
  65.             string relativePath = path.Substring(relativePathStartsAt);
  66.             doc.Add(Field.UnStored("text", ParseHtml(html)));
  67.             doc.Add(Field.Keyword("path", relativePath));
  68.             doc.Add(Field.Text("title", GetTitle(html)));
  69.             writer.AddDocument(doc);
  70.         }
  71.         /// <summary>
  72.         /// 把读取的文件中的所有的html标记去掉,把&nbsp;替换成空格
  73.         /// </summary>
  74.         /// <param name="html"></param>
  75.         /// <returns></returns>
  76.         private string ParseHtml(string html)
  77.         {
  78.             string temp = Regex.Replace(html, "<[^>]*>", "");
  79.             return temp.Replace("&nbsp;", " ");
  80.         }
  81.         /// <summary>
  82.         /// 获得读取的html文挡的标题
  83.         /// </summary>
  84.         /// <param name="html"></param>
  85.         /// <returns></returns>
  86.         private string GetTitle(string html)
  87.         {
  88.             Match m = Regex.Match(html, "<title>(.*)</title>");
  89.             if (m.Groups.Count == 2)
  90.                 return m.Groups[1].Value;
  91.             return "此文挡标题未知";
  92.         }
  93.         public void Close()
  94.         {
  95.             writer.Optimize();
  96.             writer.Close();
  97.         }
  98.     }
  99. }