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 ONif charindex(';',@Criteria)>0 or charindex('--',@Criteria)>0 or charindex('/*',@Criteria)>0 orcharindex('sysfiles',@Criteria)>0IF @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 |






