您所在的位置: 首页 > 原创 >

SQL Server 2005全文检索技术在网站上的应用实录(6)

 2008-01-11 17:27  王铁民  51CTO.com  我要评论(0)
  • 摘要:本文提供了网站如何设计和实现基于SQL Server 2005的全文检索实例,希望能对正在使用SQL Server 2005构建网站搜索的同仁有所裨益。
  • 标签:SQL Server 2005  网站  检索  SQL Server

2)建立通用分页存过程[USP_GetFrontDataList_ByFullIndex]。由于性能考虑,返回给前台页面需要网站数据库端即完成分页。

CREATE PROCEDURE [dbo].[USP_GetFrontDataList_ByFullIndex]
(
@TableViewQueryName  Varchar( 1024 ),
   --Table或View或者Query的名字或字符串 
@Key    Varchar( 50 ),  --关键字
@SelectStr   Varchar( 500 ),   --选择列字符串
@Criteria   Varchar( 8000 ),--查询条件
@Sort    Varchar( 255 ), --排序字符串
@FristTopNum   INT,      --显示的第一页置顶的数目
@Page    BIGINT  OUTPUT, --显示的当前页号
@CurrentPageRow  BIGINT,  --页大小(显示多少行)
@TotalCount   BIGINT OUTPUT   --通过该查询条件,返回的查询记录的总页数
)
AS
SET NOCOUNT ON
 if charindex(';',@Criteria)>0 or charindex('--',@Criteria)>0 or charindex('/*',
@Criteria)>0 or 
charindex('*/',@Criteria)>0 or charindex('syscolumns',@Criteria)>0  or
charindex('sysfiles',@Criteria)>0
or charindex('char(124)',@Criteria)>0  or charindex('1=1',@Criteria)>0
RETURN

DECLARE @TotalStr  nVarchar(4000)
DECLARE @Str   nVarchar(4000)
DECLARE @TopRowNum bigint
IF  @SelectStr IS NULL AND
RTRIM(LTRIM(@Criteria)) = ''
SET @SelectStr = '*'
IF @FristTopNum IS NULL AND @FristTopNum < 0
BEGIN
SET @FristTopNum = 0
END
ELSE IF @FristTopNum > @CurrentPageRow
BEGIN
SET @FristTopNum = @CurrentPageRow
END
IF  @CurrentPageRow > 0
BEGIN
IF @Criteria IS NOT NULL AND
RTRIM(LTRIM(@Criteria)) <> ''
BEGIN
SET  @TotalStr = 'SELECT @TotalCount=COUNT(*) FROM  ' +
'('+ @TableViewQueryName   +')'+ ' T '
+ ' WHERE ' + @Criteria
END
ELSE
BEGIN
SET  @TotalStr = 'SELECT @TotalCount=COUNT(*) FROM ' +
 '('+@TableViewQueryName  +')'+ ' T ' 
END
PRINT @TotalStr
EXEC  sp_ExecuteSql @TotalStr, N'@TotalCount bigint output',@TotalCount output

SET @TotalCount = @TotalCount + isnull(@FristTopNum  ,0)
DECLARE @TotalPage bigint
SET @TotalPage = @TotalCount/@CurrentPageRow
IF @TotalCount%@CurrentPageRow > 0
BEGIN
SET @TotalPage = @TotalPage + 1
END
IF @Page <= 0
BEGIN
SET @Page = 1
END
IF @TotalPage > 0 AND
@Page > @TotalPage
BEGIN
SET @Page = @TotalPage
END
--组织查询语句 
SET  @Str =  'SELECT   ' +   @SelectStr + ' FROM (' + 
@TableViewQueryName  + ') T WHERE  T.SerialNumber >' +
cast ((@Page-1)  as varchar(10)) + '*' +cast( @CurrentPageRow as varchar(10))+ 
' AND T.SerialNumber <= '+
cast (@Page  as varchar(10)) + '*' +cast( @CurrentPageRow as varchar(10))
IF @Sort IS NOT NULL ANDRTRIM(LTRIM(@Sort)) <> ''
BEGIN
IF @Criteria IS NOT NULL AND  RTRIM(LTRIM(@Criteria)) <> ''
BEGIN
SET  @Str = @Str +   ' AND (' + @Criteria + ') ORDER BY '+@Sort
END
ELSE
BEGIN
SET  @Str = @Str +   ' AND  (' + @Criteria + ') ORDER BY '+@Sort
END
END
ELSE
BEGIN

IF @Criteria IS NOT NULL AND   RTRIM(LTRIM(@Criteria)) <> ''
BEGIN
SET @str = @str +  ' AND (' + @Criteria + ')  '  
END

END
--对无记录时当前页数的处理
IF @TotalCount=0
BEGIN
SET @Page = 0
END
END

EXEC  sp_ExecuteSql @Str
 
由于本行业网站可以提高如下几类信息资源,现列表分示如下:

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  


共7页: 上一页 [1] [2] [3] [4] [5] 6 [7] 下一页
【内容导航】
 第 1 页:全文检索技术说明  第 2 页:SQL Server 2005全文索引的过程
 第 3 页:网站全文检索设计  第 4 页:数据库全文检索实现
 第 5 页:开发存储过程并把结果集分页  第 6 页:提高的几类信息资源
 第 7 页:需求规划
深入SQL Server 2008
访谈:Windows平台,企业网站漏洞的攻击和防御
SQL Server 2008/2005全解
SQL Server入门到精通
Prototype and script.aculo.us终极揭秘
 
 验证码: (点击刷新验证码)   匿名发表
  • Linux C编程实战

  • 作者:童永清
  • 本书系统地介绍了在Linux平台下用C语言进行程序开发的过程,集趣味性、实战性于一体的160多段代码实例,帮助读者快速掌握在Linu..
Copyright©2005-2008 51CTO.COM 版权所有