Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1852121
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 22:13:02

一起学习
基于MS Index Server 的全文索引实现

作者:童振华

下载源代码

  本人有个爱好就是看到网上好的文章就收藏起来。目前机器上有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 日期/时间 上次编写文件的时间。

    下载本文示例代码


    基于MS Index Server 的全文索引实现基于MS Index Server 的全文索引实现基于MS Index Server 的全文索引实现基于MS Index Server 的全文索引实现基于MS Index Server 的全文索引实现基于MS Index Server 的全文索引实现基于MS Index Server 的全文索引实现基于MS Index Server 的全文索引实现基于MS Index Server 的全文索引实现基于MS Index Server 的全文索引实现基于MS Index Server 的全文索引实现基于MS Index Server 的全文索引实现
    阅读(240) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~