数据归档






3.60/5 (2投票s)
2004年7月1日
3分钟阅读

52155

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])中执行全文搜索,并合并找到的结果。找到的结果可以按相关性、类别和名称排序。找到的结果包括 CategoryID、ResultID、Result、Path 和 Rank 值。CategoryID 用于确定找到结果的类型:目录或文件。ResultID 表示找到结果的标识符。Result 就是找到的字符串。Path 是递归构建的找到的资源路径。
      注意:@Text 输入参数的数据应为全文搜索格式。我创建了一个名为 FullTextQuery 的特殊类,它将用户查询转换为全文搜索查询。
如何使用应用程序
下载并安装项目。下载并执行 DataArchive.sql 脚本。从“开始”菜单或桌面快捷方式启动应用程序。如果应用程序无法连接到数据库,它将显示数据库连接对话框。配置数据库连接。
历史
- [2004.05.07] - 数据存档 1.0
参考
- 
      [1] 关系数据库中的分层数据。[俄语] 
- 
      [3] 安装全文搜索和索引工具。[英语] 
- 
      [4] 文件数据的全文查询。[英语] 
