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






4.89/5 (85投票s)
2005年6月16日
3分钟阅读

555141

9341
构建一个在十分之一秒内搜索您 Office 文档的应用程序。
引言
让我们来看一个练习:构建一个可以立即搜索您“文档”文件夹的 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);
}
}
组装应用程序
简而言之
- 索引只能从头开始构建。
- 我们不返回找到文档的示例。
- 我们跳过无法成功解析的文件。
- 我们在结果中加载每个文档关联的资源管理器图标。
- 您可以选择要索引的文件夹;默认情况下,它是您的文档文件夹。
- 已索引的文件类型是硬编码的(txt、htm/html、doc、xls、ppt)。
- 索引存储在您的配置文件中的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 个项目)
待续...
在下一部分文章中,我们将为这个简单的应用程序添加以下功能:
- 索引将由一个单独的应用程序处理,该应用程序将在后台持续更新索引。
- 结果将包含带有关联查询词高亮显示的文档示例。
- 我们将索引和搜索文件名和最后修改日期。