Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1270984
  • 博文数量: 953
  • 博客积分: 52320
  • 博客等级: 大将
  • 技术积分: 13090
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-05 13:42
文章分类

全部博文(953)

文章存档

2011年(1)

2008年(952)

我的朋友

分类: C/C++

2008-08-05 13:56:47

下载本文示例代码
下载源代码

  本人有个爱好就是看到网上好的文章就收藏起来。目前机器上有250M的文章了,并都已按时间,目录分类存放好。但是在查找时发现很不方便。所以想自己建一个全文索引的知识库。
  在方案选择上有ms sql server的全文检索和index server可以用。为了做个决定,自己提出了如下需求。
  1. 要求知识库以后可以按时间,依目录拆分;
  2. 要求支持word,xls,txt,ppt,带图片的html;
  3. 可以扩展支持aspx,pdf;

需求分析:
对于以上两个问题,sql server好像不能很好的满足:

  • 原因1:我要把硬盘上的文章导到数据库里,工作量很大。其次sql server差异备分=备分时刻与第一次的全备份的差异。如果有本次差异备分=第一次全备分 前N次备分那就好了。
  • 原因2:由于很多文章是HTML的。带图片。放到sql server里就有个一对多的问题。解决不了。
  • 原因3:全文检索的填充不能实时进行。
  • 原因4:文章放到数据库image类型字段后,必须通过程序来查看。没有直接放在硬盘上查看方便。

    所以最终选择index server.
  • 过程:
    (在这里我们取名KB,要索引的文章在D:\知识库\C#知识库,建成后的索引文件放在D:\KB)

    1. 启动Windows 2000 /XP上的索引;
      缺省情况下选择图标位于管理工具组中的计算机管理。窗口的右边提供关于当前在服务器上 存在的索引信息。默认有两个索引:System和Web;
    2. 要创建新的索引,用鼠标右键单击索引服务或右边的面板,选定新建编录。
      显示添加编录对话框,指定索引的名称并用浏览按钮选取位置。索引服务不会立即开始索引,此时将弹出一条消息框,单击确定继续。为了达到最佳的性能,索引服务可以放在和Web服务器隔离开的硬盘上 ;
    3. 指定索引的目录,用右键单击新建的编录名,从弹出选单中选定属性,将出现如图2所示的对话框。第一个选项卡常规显示刚刚输入的内容,在第二个选项卡跟踪中的WWW服务器下拉列表中选取你要索引的Web网站 ;
    4. 有了创建的编录,现在可以挑选你想在索引中包括的目录。

    实现方法:

    1. 用index server其实用html页面就可以实现。参考C:\WINDOWS\Help\ciquery.htm 这是用activex 实现的。
    2. 在这里我采用C#和oledb来实现。

      微软已经给我们提供了现成的oledb驱动来访问index server。其中PROVIDER=MSIDXS,具体哪些列可以选择,参看附录。

    private void BT_Search_Click(object sender, System.EventArgs e)
    
    {
    
    	string constr="PROVIDER=MSIDXS;DATA SOURCE=KB";
    
    	OleDbConnection con=new OleDbConnection(constr);
    
    	try
    
    	{
    
    		OleDbCommand cmd=new OleDbCommand();
    
    		cmd.Connection=con;
    
    		cmd.CommandText="SELECT Rank,FileName, Create, Access, Path 
    
    			FROM SCOPE() 
    
    			where CONTAINS (''\"" TB_Text.Text "\"'')";
    
    		OleDbDataAdapter da=new OleDbDataAdapter();
    
    		da.SelectCommand=cmd;
    
    		con.Open();
    
    		DataSet ds=new DataSet();
    
    		da.Fill(ds);
    
    		dataGrid1.DataSource=ds;
    
    	}
    
    	catch(Exception E)
    
    	{
    
    		Console.Write(E.Message);
    
    	}
    
    	finally
    
    	{
    
    		con.Close();
    
    	}
    
    	
    
    }
    
    
    关于文档格式扩展。为了实现对aspx,apcx可以通过增中过滤器来实现。 例如对aspx,和ascx的索引可以在注册表中加以下注册项。
    [HKEY_CLASSES_ROOT\.aspx\PersistentHandler] ="{eec97550-47a9-11cf-b952-00aa0051fe20}" 
    
    [HKEY_CLASSES_ROOT\.ascx\PersistentHandler] ="{eec97550-47a9-11cf-b952-00aa0051fe20}" 

    对于pdf格式的过滤器在adobe的网站上也有。

    附录

    字段名 字段类型 说明
    ---------------------------------------------------------------------------
    Access 日期/时间 上次访问文件的时间。
    Characterization 文本/字符串 文档的特征或摘要。由索引服务器计算。
    Create 日期/时间 文件的创建时间。
    Directory 文本/字符串 文件的物理路径,不包括文件名。
    DocAppName 文本/字符串 创建文件的应用程序的名称。
    DocAuthor 文本/字符串 文档的作者。
    DocByteCount 数字 文档的字节数。
    DocCategory 文本/字符串 文档的类型,如备注、计划或白皮书。
    DocCharCount 数字 文档中的字符数。
    DocComments 文本/字符串 有关文档的注释。
    DocCompany 文本/字符串 为其编写文档的公司的名称。
    DocCreatedTm 日期/时间 文档的创建时间。
    DocEditTime 日期/时间 编辑文档所花费的总时间。
    DocHiddenCount 数字 PowerPoint 文件中的隐藏幻灯片数。
    DocKeywords 文本/字符串 文档的关键字。
    DocLastAuthor 文本/字符串 最近编辑过文档的用户。
    DocLastPrinted 日期/时间 上次打印文档的时间。
    DocLastSavedTm 日期/时间 上次保存文档的时间。
    DocLineCount 数字 文档中包含的行数。
    DocManager 文本/字符串 文档作者的管理者名称。
    DocNoteCount 数字 PowerPoint 文件中带有注释的页数。
    DocPageCount 数字 文档中的页数。
    DocParaCount 数字 文档中的段落数。
    DocPartTitles 文本/字符串 文档组成部分的名称。例如,在 Microsoft Excel 中,电子表格是文档的组成部分。在 PowerPoint 中,幻灯片是文档的组成部分。在 Word 中,包含在主文档中的文档的文件名是文档的组成部分。
    DocPresentationTarget 文本/字符串 PowerPoint 演示文稿的目标格式(如 35mm、打印机、视频,等等)。
    DocRevNumber 文本/字符串 文档的当前版本号。
    DocSlideCount 数字 PowerPoint 文件中的幻灯片数。
    DocSubject 文本/字符串 文档的主题。
    DocTemplate 文本/字符串 文档的模板名称。
    DocTitle 文本/字符串 文档的标题。
    DocWordCount 数字 文档中的字数。
    FileIndex 数字 文件的唯一标识。
    FileName 文本/字符串 文件的名称。
    HitCount 数字 文件中的匹配(与查询匹配的字词)数。
    Path 文本/字符串 文件的完整物理路径,包括文件名。
    Rank 数字 行的等级号。范围介于 0 到 1000 之间。数字越大,匹配率越高。
    ShortFileName 文本/字符串 简短 (8.3) 文件名。
    Size 数字 文件大小,以字节为单位。
    VPath 文本/字符串 文件的完整虚拟路径,包括
    文件名。如果有多个可能的路径,则选择与特定查询最匹配的路径。
    Write 日期/时间 上次编写文件的时间。

    下载本文示例代码
    阅读(68) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~