65.9K
CodeProject 正在变化。 阅读更多。
Home

桌面搜索应用程序:第一部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (85投票s)

2005年6月16日

3分钟阅读

viewsIcon

555141

downloadIcon

9341

构建一个在十分之一秒内搜索您 Office 文档的应用程序。

Sample Image - screenshot1.gif

引言

让我们来看一个练习:构建一个可以立即搜索您“文档”文件夹的 C# 应用程序。我们需要该应用程序能够

  • 搜索Office 文档(Word、Excel、PowerPoint)的内容。即 XLS、DOC、PPT 文件。
  • 搜索HTML 文档的内容。
  • 搜索文本文档的内容。
  • 快速搜索(即,在一秒内给出结果)。
  • 允许直接从结果列表中打开文档。

更新:此桌面搜索应用程序现已成为 Seekafile Server 1.0 - 开源索引服务器 的一部分。该服务器提供后台自动索引,您可以通过 Windows Forms 客户端搜索应用程序 搜索索引。另请参阅 Seekafile Server 路线图

任务 1:全文索引

为了进行索引和搜索,我们将使用一个出色的搜索引擎,名为 DotLucene。它是 Java Lucene 的 C# 移植版,由 George Aroush 维护。它具有许多很棒的功能

  • 性能非常好。
  • 排名靠前的搜索结果。
  • 结果中的搜索查询高亮显示。
  • 搜索结构化和非结构化数据。
  • 元数据搜索(按日期查询,搜索自定义字段...)。
  • 索引大小约为已索引文本的 30%。
  • 还可以存储完整索引的文档。
  • 纯托管 .NET,单个程序集。
  • 非常友好的许可(Apache 软件许可证 2.0)。
  • 可本地化(在 DotLucene 国家语言支持包 中包含巴西、捷克、中文、荷兰、英语、法语、德语、日语、韩语和俄语的支持)。
  • 可扩展(包含源代码)。

有关创建索引和搜索的更多详细信息,请参阅我之前的文章:DotLucene:用 37 行代码为您的内网或网站实现全文搜索

任务 2:解析 Office 文档

由于 DotLucene 只能索引纯文本,因此我们需要解析 Office 文档并从中提取文本。读取它们的二进制结构并非易事。但是,在 Windows 2000+ 上,我们可以使用 IFilter 接口,它是 Windows 索引服务的一部分。它默认安装在所有 Windows 2000+ 系统上(无需安装 Office)。

IFilter API 也被 Windows 桌面搜索(MSN 搜索工具栏)和 Lookout 使用,因此您不必担心我们会使用一些不常见的技术来解析文档。如果安装了相应的 过滤器,它还可以解析其他文件类型。

使用 IFilter 接口需要大量的 COM 互操作,这有点棘手。在调整了网上 示例可用代码 后,我终于得到了一些在大多数情况下都能正常工作的代码。

public static string Parse(string filename)
{
  IFilter filter = null;
  try {
    StringBuilder plainTextResult = new StringBuilder();
    filter = loadIFilter(filename); 
    STAT_CHUNK ps = new STAT_CHUNK();
    IFILTER_INIT mFlags = 0;
    uint i = 0;
    filter.Init( mFlags, 0, null, ref i);
    int resultChunk = 0;
    resultChunk = filter.GetChunk(out ps);
    while (resultChunk == 0)
    {
      if (ps.flags == CHUNKSTATE.CHUNK_TEXT)
      {
        uint sizeBuffer = 60000;
        int resultText = 0;
        while (resultText == Constants.FILTER_S_LAST_TEXT || resultText == 0)
        {
          sizeBuffer = 60000;
          System.Text.StringBuilder sbBuffer = 
             new System.Text.StringBuilder((int)sizeBuffer);
          resultText = filter.GetText(ref sizeBuffer, sbBuffer);
          if (sizeBuffer > 0 && sbBuffer.Length > 0)
          {
            string chunk = sbBuffer.ToString(0, (int)sizeBuffer);
            plainTextResult.Append(chunk);
          }
        }
      }
      resultChunk = filter.GetChunk(out ps);
    }
    return plainTextResult.ToString();
  }
  finally
  {
    if (filter != null)
      Marshal.ReleaseComObject(filter);
  }  
}

组装应用程序

简而言之

  • 索引只能从头开始构建。
  • 我们不返回找到文档的示例。
  • 我们跳过无法成功解析的文件。
  • 我们在结果中加载每个文档关联的资源管理器图标。
  • 您可以选择要索引的文件夹;默认情况下,它是您的文档文件夹。
  • 已索引的文件类型是硬编码的(txthtm/htmldocxlsppt)。
  • 索引存储在您的配置文件中的Local Settings/Application Data/DesktopSearch文件夹下。
  • 请记住,可以在索引进行时进行搜索

性能

一些统计数据(Athlon XP 2000+、1GB RAM、Seagate SATA 硬盘 7200 RPM)

  • 已索引文档:1185
  • 已索引文档的总大小:120,690,622 字节
  • 重新构建索引花费了:5 分钟 55 秒
  • 索引大小:4,339,950 字节
  • 搜索时间(包括显示渲染):从 0.0937 秒(找到 25 个项目)到 0.3125 秒(找到 213 个项目)

待续...

在下一部分文章中,我们将为这个简单的应用程序添加以下功能:

  • 索引将由一个单独的应用程序处理,该应用程序将在后台持续更新索引。
  • 结果将包含带有关联查询词高亮显示的文档示例。
  • 我们将索引和搜索文件名和最后修改日期。

资源和致谢

搜索引擎

Seekafile Server - 开源索引服务器

Office 文档解析

外观

© . All rights reserved.