快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和记娱乐和记怡情AG:SQL Server 2005全文检索技术在网站上的应用实录全文检索



一、媒介

“人类掉去搜索,天下将会如何?”,同样,很难想象一个拥有极大年夜信息量的行业网站门户没有站内全文搜索将会呈现如何的场所场面,网站全文检索对付掘客网站信息和整合网站资本的代价是不言而喻的。我们看到,通用型的搜索引擎已经成为了互联网天下的门户,而对付一个信息量极其富厚的网站而言,全网搜索或许会成为本网站的门户,恰是所谓的门户之门。

实现网站全文检索有几种常见规划,比如利用数据库全文检索,开源搜索引擎,应用Google API等, 本文我们姑息若何应用SQL Server 2005多快好省地建立网站全文检索展开探究。

二、全文检索技巧阐明

1、利用背景

先先容下Z网站,它是海内投融资行业最大年夜的行业门户,网站拥有海量的融资信息、投资信息、招商信息、创业信息、商机信息、资讯信息、产权买卖营业信息、招标投标信息、中标信息、会展信息等投融资行业的信息资本。网站全文检索实现的重要需求就在于能够让用户输入诸如行业关键字后系统能快速返回给相符用户在全范围内查找前提的记录, 从而有效地使用资本,更好地满意用户需求。

2、主要检索技巧的差别

有了数据然则没有被应用,那么这些数据不应该被称为信息。它们无非是赓续充斥设备和收集的比特而已,然则若何把数据掘客出来供给给必要的职员,检索技巧是此中异常有效的道路之一。

现基于微软平台,针对SQL Server 2005供给的全文检索技巧进行先容。与关系数据查询、多维数据库查询和基于XML的XQuery、XPath不合,全文检索技巧主要处置惩罚工具是基于超大年夜 数据量的文本数据和布局化的二进制数据上类似LIKE的隐隐查询。主要差别见下表。

表1:全文检索与关系数据库查询、多维数据查询、XML查询的比较

关系数据库查询

多维数据查询

XML查询

全文检索

检索技巧

SQL

MDX

XQuery、XPath

SQL (extension)

主要处置惩罚工具

关系二维数据

布局化多维数据

层次型数据

大年夜容量二维和层次型数据的隐隐检索

主要利用领域

一样平常的OLTP类利用

一样平常的OLAP类阐发型利用

面向Internet、Intranet的疏松耦合SOA利用

企业/网站内部信息/常识治理类利用

索引

大年夜量应用非聚簇索引,一样平常保存在数据库中。

经由过程层次型、保存中心结果的要领,经由过程不合的轴向快速定位信息剖面。

基于XPath的索引,索引一样平常保存在数据库中。

基于关键字的索引,保存在文件系统中。每个表仅支持一个索引。

3、全文检索技巧简要先容

全文检索主要利用领域如下:

(1)大年夜数据量、超大年夜数据量的布局化平文本数据和隐隐匹配查找(Char、Varchar、Nvarchar)。

(2)大年夜数据量、超大年夜数据量的层次型XML数据展开后的查找---含隐隐查找(Xml type)。

(3)标准款式的二进制非布局化Word数据的查找(VarBinary[max]、Image)。

与其他检索技巧不合的是,全文检索不仅仅供给词汇层次的查询支持,而且可以根据说话情况、不合说话的特征,以致于用户自定义的设置设置设备摆设摆设供给不合语义级的大年夜容量的数据隐隐匹配检索支持。为了供给语义层次的检索,SQL Server 2005的全文检索明确了如下几个观点:

(1)断字符(Word Breaker):由于对付不合的说话,哪些符号可以用于词汇的瓜分是不合的,是以全文检索支持不合说话情况的不合断字符。

(2)标记(Token):是由断字符标识的词或字符串。因为划分是基于特定说话完成的,是以也可以做到语义层次的支持。

(3)滋扰词(Noise Word):主如果那些常常呈现,然则对付检索没有若干赞助的词汇。例如:英语中的“a”、 “and”、 “is”、 “the”,汉语中的“的”、 “不”、 “以”、 “了”等。SQL Server 2005中供给设置设置设备摆设摆设文件,容许用户自定义自己说话、以致与本行业、本企业的检索滋扰词。

(4)词干阐发器(Stemmer):经由过程断字符瓜分后,根据详细的说话和该说话的语律例程天生的特定词汇的变形。 这个等于搜索引擎常提到的分词技巧。

(5)同义词:即就是同一个说话,在检索的环境下也存在同义词若何处置惩罚的问题。假如一个检索系统不能够识别近义词,而只能识别完全匹配的词汇,那对付我们中文这种表义的说话而言会带来很大年夜不便。同样的,一个行业内部也有很多同义词或者是缩略语。例如如下的词语。

广播行业:“ABC”与“英国ABC广播公司”基础上类似,然则也可能和“澳大年夜利亚广播公司”肴杂。

政府行文:“ABC”与南美的“阿根廷、巴西、智利三国”是同义词。

不仅如斯,因为日常应用的习气,我们在白话表达和书面语表达上也有差别,这个也必要预先定义。例如,很多口头常用的技巧产品“Win2K”、 “WinXP”等,一样平常都很正式的称为“Windows 2000”和 “Windows XP”,是以SQL Server 2005上也供给类似词汇调换的支持,而且这些支持也是与详细说话相关的。

4、SQL Server 2005全文检索的技巧架构

让我们首先得问自己,什么是全文检索?它是指Microsoft SQL Server 2005 具备针对 Microsoft SQL Server 表中基于纯字符的数据进行全文查询的功能。全文查询可以包括词和短语,或者词或短语的多种形式。

当我们明确了全文检索观点之后,我们来看看它的内部布局。

Microsoft SQL Server 2005 中的全文搜索由 Microsoft Full-Text Engine for SQL Server (MSFTESQL) 办事供给支持。MSFTESQL 办事有两个角色,即索引支持和查询支持。

全文搜索的组件

全文搜索的体系布局由下列组件构成:

◆Microsoft Full-Text Engine for SQL Server (MSFTESQL)

◆Microsoft Full-Text Engine Filter Daemon (MSFTEFD),它包孕下列组件:

(1)筛选器

(2)协议处置惩罚法度榜样

(3)断字符

SQL Server中的全文搜索的体系布局如下所示。

图1

让我们一一先容两类紧张的引擎及其在全部体系布局中的紧张感化。

Full-Text Engine for SQL Server (MSFTESQL)

MSFTESQL 办事认真进行下列操作:

◆添补全文索引。

◆治理全文索引和全文目录。

◆赞助对 SQL Server 数据库中的表进行全文搜索。

让我们来看看SQL Server 2005全文索引的历程

全文添补(也称为爬网或爬虫)开始后,数据库引擎会将大年夜批数据存入内存并看护 Microsoft SQL Server 全文引擎 (MSFTESQL) 办事开始进行索引。MSFTESQL 办事将对表的某一列或几列中的字符和款式化二进制数据体例索引。全文引擎将应用协议处置惩罚法度榜样组件从内存中掏出数据并进行进一步处置惩罚,从而天生全文索引。

对存储在 varbinary(max) 或 image 列中的数据体例索引时,筛选器(实现了 IFilter 接口)将基于为该数据指定的文件款式(例如,Microsoft Word)来提取文本。在某些环境下,筛选器组件会要求将 varbinary(max) 或 image 数据写到办事帐户 Temp 目录中,而不是将其存入内存。

在处置惩罚历程中,经由过程断字符将网络到的文本数据分隔成各个零丁的标记或关键字。用于标记化的说话将在列级指定,或者也可以经由过程筛选器组件在 varbinary(max)、image 或 xml 数据内标识。

还可能履行其他处置惩罚以删除滋扰词并在将标记存储到全文索引或索引片断中之前将这些标记规范化。

Microsoft Full-Text Engine for SQL Server 的功能

SQL Server 2005 为全文引擎供给了并行安装要领。这意味着对付每个 SQL Server 实例,都存在一个专用的 MSFTESQL 实例,此中包括专用的组件(例如断字符和筛选器)、资本(例如内存)和设置设置设备摆设摆设(例如办事级设置,实例级的 resource_usage 是一个更详细的例子)。单个 MSFTESQL 办事实例可治理相关联的 SQL Server 实例的全文索引。使用 MSFESQL 办事,SQL Server 可越过 SQL 标准对字符串列履行更为繁杂的搜索。

MSFTESQL 办事担当了以下角色:

索引支持

MSFTESQL 实现了为数据库定义的全文目录和索引。

查询支持

MSFTESQL 可处置惩罚全文搜索查询并确定索引中相符全文选择前提的项。对付相符选择前提的每一项,MSFTESQL 将向 SQL Server 办事返回响应行的标识外加一个排名值,而后者将应用这些信息来构造查询结果集。所支持的查询类型包括:

◆搜索词或短语。

◆搜索位置左近的词。

◆搜索词的变形。

可治理性支持

全文目录和索引不会存储在 SQL Server 数据库中。MSFTESQL 办事认真治理全文目录。

Microsoft Full-Text Engine Filter Daemon

MSFTEFD 由认真从表中造访和筛选数据以及进行断字和词干阐发的组件组成。

◆筛选器

筛选器的义务是从文档中提取文本化信息流,并舍弃所有非文本化信息和款式化信息。筛选器将天生文本字符串和属性/值对,并依次将它们通报给索引引擎。

筛选器可从特定的文档款式(如 Microsoft Word 文档或文本文件)中提取文本化信息。例如,Microsoft 供给了 Microsoft Office 筛选器,此筛选器可以从 Word、Microsoft Excel 和 Microsoft PowerPoint 文件中提取文本和属性。其他筛选器用于处置惩罚 HTML 或电子邮件。还可以应用第三方筛选器。

◆SQL 协议处置惩罚法度榜样

在 SQL Server 2005 中,SQL 协议处置惩罚法度榜样的事情是从和记娱乐和记怡情AG指定命据库中的表内造访数据。

断字符

断字符是用于在查询或抓取的文档中确定字符流中的字符界限位置。有关具体信息。

全文搜索的索引组件认真全文索引的初始添补,以及当全文索引表中的数据被改动时该索引的后续更新。为了提升全文索引历程的效率,Microsoft SQL Server 2005 改进了全文网络机制的体系布局,从而大年夜大年夜增强了机能。

Microsoft Full-Text Engine for SQL Server (MSFTESQL) 办事是一个全文索引和搜索引擎。MSFTESQL 引擎基于 Microsoft Search (MSSearch) 技巧,它与 Microsoft SQL Server 2005 Database Engine 进行了最为慎密的集成。

全文引擎作为 MSFTESQL 办事在操作系统上运行。SQL Server 与 MSFTESQL 必须拥有相同的办事帐户。默认环境下将安装 MSFTESQL 办事,然则只有在应用全文搜索时才会运行此项办事。

三、网站全文检索设计

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

ALTER FULLTEXT INDEX ON TableName ADD ColumnName

b)和记娱乐和记怡情AG选择或创建新的索引目录。

图7

c)定义添补计划。

图8

至此,表的全文索引已经建立完毕,表示只要键入SQL 指令就可以完玉成文检索功能。

第三步,开拓存储历程并把结果集分页,以供前台页面调用返回查询的结果。

1) 建立找本钱全文检索储存历程USP_CaptialInfo_Full和记娱乐和记怡情AGIndex。

/*

找本钱全文索引开拓历程

*/

CREATE PROCEDURE USP_CaptialInfo_FullIndex

(

@TableViewQueryNameVarchar( 1024 ), --传入的查询字符窜

@SearchKeyword nvarchar(100), --传入的查询关键字

@SelectStr Varchar( 500 ), --选择列字符串

@Criteria Varchar( 8000 ), --查询前提

@Sort Varchar( 255 ), --排序字符串

@FristTopNum int,  --显示的第一页置顶的数目

@Page bigint OUTPUT , --显示确当前页号

@CurrentPageRowbigint,  --页大年夜小(显示若干行)

@TotalCount bigint output, --经由过程该查询前提,返回的查询记录的总页数

@Totaltimes bigint output --所有搜索光阴,以秒为单位

)

as

DECLARE @starttime datetime,

@endtime datetime

SELECT @starttime = getdate()

IF ISNULL(@SearchKeyword,'') !='' OR RTRIM(@SearchKeyword)!=''

BEGIN

SET @TableViewQueryName =

' SELECT '+

' ROW_NUMBER() OVER (ORDER BY RANK DESC) AS SerialNumber ,'+

' F.[rank], '+

' p.*' +

' FROM'+

' FREETEXTTABLE( CapitalInfoFactTab , (ProvinceName, CityName,

CountyName, Keyword,Title ,IndustryBName , shortcontent, ComAbout , ComBreif) ,

'+ ''''+@SearchKeyword+ ''''+') AS f '+

' INNER JOIN  CapitalInfoFactTab  AS p '+

' ON f.[key] = p.infoID '

EXEC [USP_GetFrontDataList_ByFullIndex] @TableViewQueryName,

@SearchKeyword, @SelectStr, @Criteria, @Sort, @FristTopNum,

@Page OUTPUT , @CurrentPageRow , @TotalCount OUTPUT

END ELSE BEGIN

EXEC dbo.GetFrontDataList 'dbo.ProjectInfoFactTab', 'InfoID',

@SelectStr,@Criteria,@Sort,0, @Page output, @CurrentPageRow,

@TotalCount output

END

SELECT @endtime = getdate()

SELECT @Totaltimes = DATEdiff(Ms, @starttime ,@endtime)

RETURN

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  --经由过程该查询前提,返回的查询记录的总页数

)

ASSET NOCOUNT ONif charindex(';',@Criteria)>0 or charindex('--',@Criteria)>0 or charindex('/*',@Criteria)>0 or

charindex('*/',@Criteria)>0 or charindex('syscolumns',@Criteria)>0 orcharindex('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@CurrentPageRow

BEGIN

SET @FristTopNum = @CurrentPageRow

ENDIF @CurrentPageRow > 0

BEGIN

IF @Criteria IS NOT NULL AND

RTRIM(LTRIM(@Criteria)) '('+ @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 @Page0 AND

@Page > @TotalPage

BEGIN

SET @Page = @TotalPage

END--组织查询语句

SET @Str = 'SELECT  ' +  @SelectStr + ' FROM (' + @TableViewQueryName + ') T WHERE T.SerialNumber >和记娱乐和记怡情AG9; +

cast ((@Page-1) as varchar(10)) + '*' +cast( @CurrentPageRow as varchar(10))+ ' AND T.SerialNumber IF @Sort IS NOT NULL ANDRTRIM(LTRIM(@Sort))''

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))

因为本行业网站可以前进如下几类信息资本,现列表分示如下:

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 @和记娱乐和记怡情AGRC = [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

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: