?
快捷搜索:  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) ,

'+ ''''[email protected]+ ''''+') 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 @[email protected]

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 ' +'('[email protected] +')'+ ' 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 '[email protected]

END

ELSE

BEGIN

SET @Str = @Str +  ' AND (' + @Criteria + ') ORDER BY '[email protected]

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

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

快三平台开户