数据归档






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] 文件数据的全文查询。[英语]