1、架构设计
采 用OLTP交易数据库和OLAP数据仓库(用于搜索和分析)分离的模式,OLTP作为OLAP的数据源通过SQL Server Integration Services (SSIS)定期导入到OLAP数据仓库环境中,OLAP采用星型结构以便于更好地满足搜索和将来的数据挖掘。 OLAP数据仓库的建立目标为了检索和数据挖掘,故其事实表的建立可以反范式原则设计。
![]() |
图2 |
2、原型设计(由于篇幅限制,这里仅给出搜索主页和主要资源查询页面)
![]() |
图3 |
3、数据库设计
![]() |
图4 |
4、数据字典
MainInfoTab(信息主表)
CapitalInfoTab(资本信息明细表)
ProjectInfoTab(项目信息明细表)
MerchantInfoTab(政府招商信息明细表)
四、数据库全文检索实现
至此,我们已经完成了全文检索的设计工作,现在可以来实现它的功能啦!
首先, 让我们建立检索表的全文检索,全文检索要求唯一索引,故需要在相关表建立唯一聚集索引。
第二步,使用SQL DDL或者SQL Server Management Studio建立表的全文检索。
1)使数据库支持全文检索。
![]() |
图5 |
或者通过键入命令 EXEC SP_FULLTEXT_DATABASE 'Enable' 命令达到同样效果。
2)定义表的全文检索目录和索引字段。
在表的鼠标右键通过点击“全文检索定义全文检索”将弹出如下执行向导,本向导执行完毕则该表的全文检索业已完毕。
a)选择要索引的字段
![]() |
图6 |
或者键入如下命令:
CREATE FULLTEXT INDEX ON TableName KEY INDEX PK_IndexName ON DB WITH CHANGE_TRACKING AUTO |
b)选择或创建新的索引目录。
![]() |
图7 |
c)定义填充计划。
![]() |
图8 |
至此,表的全文索引已经建立完毕,表示只要键入SQL 指令就可以完成全文检索功能。
第三步,开发存储过程并把结果集分页,以供前台页面调用返回查询的结果。
1) 建立找资本全文检索储存过程USP_CaptialInfo_FullIndex。
/* |
2)建立通用分页存过程[USP_GetFrontDataList_ByFullIndex]。由于性能考虑,返回给前台页面需要网站数据库端即完成分页。
CREATE PROCEDURE [dbo].[USP_GetFrontDataList_ByFullIndex] --Table或View或者Query的名字或字符串 SET NOCOUNT ON if charindex(';',@Criteria)>0 or charindex('--',@Criteria)>0 or charindex('/*', @Criteria)>0 or charindex('sysfiles',@Criteria)>0 IF @CurrentPageRow > 0 '('+ @TableViewQueryName +')'+ ' T ' '('+@TableViewQueryName +')'+ ' T ' --组织查询语句 @TableViewQueryName + ') T WHERE T.SerialNumber >' + ' AND T.SerialNumber <= '+ IF @Sort IS NOT NULL ANDRTRIM(LTRIM(@Sort)) <> '' |
由于本行业网站可以提高如下几类信息资源,现列表分示如下:
ID | 检索内容 | 数据表 | 检索命令示例 |
1 | 投资 | CapitalInfoTab | DECLARE @RC int |
DECLARE @TableViewQueryName varchar(1024) | |||
DECLARE @SearchKeyword nvarchar(100) | |||
DECLARE @SelectStr varchar(500) | |||
DECLARE @Criteria varchar(8000) | |||
DECLARE @Sort varchar(255) | |||
DECLARE @FristTopNum int | |||
DECLARE @Page bigint | |||
DECLARE @CurrentPageRow bigint | |||
DECLARE @TotalCount bigint | |||
DECLARE @Totaltimes bigint | |||
-- TODO: 在此处设置参数值。 | |||
SET @SearchKeyword = '地产项目' | |||
SET @SelectStr = '*' | |||
SET @Sort = '' | |||
SET @Page= 1 | |||
SET @CurrentPageRow = 20 | |||
EXECUTE @RC = [InvestDM].[dbo].USP_CapitalInfo_FullIndex | |||
@TableViewQueryName | |||
,@SearchKeyword | |||
,@SelectStr | |||
,@Criteria | |||
,@Sort | |||
,@FristTopNum | |||
,@Page | |||
,@CurrentPageRow | |||
,@TotalCount OUTPUT | |||
,@Totaltimes OUTPUT | |||
SELECT @Page,@TotalCount,@Totaltimes | |||
2 | 融资 | ProjectInfoTab | DECLARE @SearchKeyword nvarchar(100) --传入的查询关键字 |
SET @SearchKeyword = '深圳' | |||
SELECT p.title, | |||
p.infoid, | |||
f.[rank] , | |||
keyword,title,provinceName,cityName,CountyName | |||
FROM | |||
FREETEXTTABLE([ProjectInfoFactTab], (provinceName,cityName,CountyName,keyword,title), @SearchKeyword) AS f | |||
INNER JOIN [ProjectInfoFactTab] AS p | |||
ON f.[key] = p.infoID | |||
ORDER BY RANK DESC | |||
3 | 招商 | MerchantInfoTab | DECLARE @SearchKeyword nvarchar(100) --传入的查询关键字 |
SET @SearchKeyword = '深圳' | |||
SELECT | |||
ROW_NUMBER() OVER (ORDER BY RANK DESC) AS SerialNumber , | |||
F.[rank], | |||
p.* | |||
FROM | |||
FREETEXTTABLE( MerchantInfoFactTab , (ProvinceName, CityName, CountyName, Keyword, | |||
Title ,IndustryBName , shortcontent, ZoneAbout , ZoneAboutBrief, MerchantTypeName ,MerchantAttributeName, CooperationDemandName ) , @SearchKeyword) AS f | |||
INNER JOIN MerchantInfoFactTab AS p | |||
ON f.[key] = p.infoID | |||
4 | 资讯 | NewsTab | DECLARE @SearchKeyword nvarchar(100) --传入的查询关键字 |
SET @SearchKeyword = '深圳' | |||
SELECT | |||
ROW_NUMBER() OVER (ORDER BY RANK DESC) AS SerialNumber , | |||
F.[rank] , | |||
p.* | |||
FROM | |||
FREETEXTTABLE( NewsInfoFactTab , (AreaName, Keyword, | |||
Title , DisplayTitle, subtitle ,Summary , Content ,NewsIndustryName , NewsTypeName ) , @SearchKeyword ) AS f | |||
INNER JOIN NewsInfoFactTab AS p | |||
ON f.[key] = p.infoID |