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

数据归档

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.60/5 (2投票s)

2004年7月1日

3分钟阅读

viewsIcon

52155

downloadIcon

2249

本文介绍了使用关系数据库创建索引搜索系统。

引言

很久以前,我的 CD 收藏很少,但很快就变得庞大且难以管理。我花了大量时间来查找一些文档。因此,我决定索引我的 CD 收藏。起初,我尝试了几种现有的 CD 目录组织程序,但它们没有良好的搜索功能和直观的用户界面。这就是为什么我决定创建自己的搜索程序。本文介绍了一种创建索引搜索系统的方法。

背景

我建议您查阅 MS SQL Server 2000 联机丛书中的“全文搜索概述”和“CONTAINSTABLE”文章。

项目概述

应用程序功能可分为两类:扫描数据源和文档搜索。前者可以使用递归目录浏览轻松实现。后者需要某种索引机制,即搜索数据需要被索引。可以手动创建索引机制 [2],但我决定使用一种更简单的方法,即利用 Microsoft SQL Server 的全文搜索功能。

使用代码


RegistryHelper RegistryHelper 类管理 Windows 注册表项/值,并提供了一个方便的接口来设置/获取应用程序设置。
SqlHelper 实现数据访问方法。
FullTextQuery FullTextQuery 类将用户搜索查询转换为全文查询。
DirectoryScaner 扫描文件系统层级并获取目录和文件的描述。
ScanForm 显示扫描表单。
SqlConnStringForm 解析并生成 Microsoft SQL Server 连接字符串。
SearchForm 提供搜索存档文档的 GUI。
MainForm 显示主应用程序表单。
存储过程

[sp_BuildIndexes] 启动增量索引构建。
[sp_CreateDirectory] 创建目录记录。
[sp_CreateFile] 创建文件记录。
[sp_CreateRootDirectory] 创建目录记录。
[sp_DeleteDirectory] 删除目录记录。
[sp_DeleteFile] 删除文件记录。
[sp_GetDirectory] 获取目录信息。
[sp_GetDirectoryFiles] 获取指定目录的所有文件。
[sp_GetDirectoryPath] 获取目录的所有子目录。
[sp_GetFile] 获取文件信息。
[sp_GetFilePath] 获取文件的完整路径。
[sp_GetRootDirectories] 获取所有根目录。
[sp_GetSubDirectories] 获取目录的所有子目录。
[sp_Search] 搜索文件或目录。
[sp_UpdateDirectory] 更新目录记录。
[sp_UpdateFile] 更新文件记录。
用户定义函数

[fn_GetDirectoryPath] 构建并获取完整的目录路径。
[fn_GetFilePath] 构建并获取完整的文件路径。

[sp_Search]

-- Search for a file or directory.
CREATE PROCEDURE [dbo].[sp_Search]
  @Text       NVARCHAR(256),
  @Sort       INT  = 1, -- Rank
  @Created     DATETIME = NULL,
  @Modified     DATETIME = NULL
AS
-- 
DECLARE @DirectoryCategory  INT
SET @DirectoryCategory = 1

DECLARE @FileCategory  INT
SET @FileCategory = 2
--
DECLARE @results TABLE 
(
  CategoryID    INT NOT NULL,
  ResultID     INT NOT NULL,
  Result       NVARCHAR(260) NOT NULL,
  Path      NVARCHAR(2048) NOT NULL,
  Rank      INT NOT NULL DEFAULT 0
)
-- Search in directories.
INSERT
  @results
SELECT 
  @DirectoryCategory    AS CategoryID,
  DataTbl.DirectoryID    AS ResultID,  
  DataTbl.Name       AS Result,
  [dbo].[fn_GetDirectoryPath] (DataTbl.DirectoryID)  AS Path,
  KeyTbl.[RANK]      AS Rank
FROM
  [dbo].[Directories] AS DataTbl
JOIN
  CONTAINSTABLE([dbo].[Directories], *, @Text) AS KeyTbl
ON
  DataTbl.DirectoryID = KeyTbl.[KEY]

-- Search in files.
INSERT
  @results
SELECT 
  @FileCategory      AS CategoryID,
  DataTbl.FileID      AS ResultID,  
  DataTbl.Name       AS Result,
  [dbo].[fn_GetFilePath] (DataTbl.FileID)  AS Path,
  KeyTbl.[RANK]      AS Rank
FROM
  [dbo].[Files] AS DataTbl
JOIN
  CONTAINSTABLE([dbo].[Files], *, @Text) AS KeyTbl
ON
  DataTbl.FileID = KeyTbl.[KEY]

IF (@Sort = 1) -- Relevance
  BEGIN
    SELECT 
      CategoryID, ResultID, Result, Path, Rank
    FROM
      @results
    ORDER BY
      Rank DESC
  END
ELSE IF (@Sort = 2) -- Category
  BEGIN
    SELECT 
      CategoryID, ResultID, Result, Path, Rank
    FROM
      @results
    ORDER BY
      CategoryID ASC
  END
ELSE IF (@Sort = 3) -- Name
  BEGIN
    SELECT 
      CategoryID, ResultID, Result, Path, Rank
    FROM
      @results
    ORDER BY
      Result ASC
  END
ELSE -- undefined sort parameter - does not sort results
  BEGIN
    SELECT 
      CategoryID, ResultID, Result, Path, Rank
    FROM
      @results
  END
GO

我认为应该更详细地解释此存储过程。[dbo].[sp_Search] 存储过程在目录([dbo].[Directories])和文件([dbo].[Files])中执行全文搜索,并合并找到的结果。找到的结果可以按相关性、类别和名称排序。找到的结果包括 CategoryIDResultIDResultPathRank 值。CategoryID 用于确定找到结果的类型:目录或文件。ResultID 表示找到结果的标识符。Result 就是找到的字符串。Path 是递归构建的找到的资源路径。

注意:@Text 输入参数的数据应为全文搜索格式。我创建了一个名为 FullTextQuery 的特殊类,它将用户查询转换为全文搜索查询。

如何使用应用程序

下载并安装项目。下载并执行 DataArchive.sql 脚本。从“开始”菜单或桌面快捷方式启动应用程序。如果应用程序无法连接到数据库,它将显示数据库连接对话框。配置数据库连接。

历史

  • [2004.05.07] - 数据存档 1.0

参考

© . All rights reserved.