成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

在SQL Server 2005中用存儲過程實現搜索功能

瀏覽:182日期:2023-11-05 12:59:50

現在很多網站都提供了站內的搜索功能,有的很簡單在SQL語句里加一個條件如:where names like ‘%words%’就可以實現最基本的搜索了。

我們來看看功能強大一點,復雜一點的搜索是如何實現的(在SQL SERVER200/2005通過存儲過程實現搜索算法)。

我們把用戶的搜索可以分為以下兩種:

1.精確搜索,就是把用戶輸入的各個詞語當成一個整體,不分割搜索.

2.像百度,GOOGLE一樣的,按空格把輸入的每一個詞分離,只要包含這些詞語,而不管出現的順序,稱為ALL-Word Search.

3.對輸入的詞只要有一個出現就為匹配 稱為Any-Word Search

一、對搜索結果進行排序的算法

在前面提到的LIKE語句最大的問題就是搜索的結果是沒有經過排序的,我們不知道結果出現在的順序是如何的,因為它是隨機的。像百度,GOOGLE都會對結果用算法進行排序再顯示的.好我們也來建立一個簡單的排序法。一個很常見的算法是計算關鍵詞在被搜索內容中出現的次數,次數最多的排在結果的第一位。我們的是在存儲過程中實現這個算法的,而在SQLSERVER中沒有提供計算關鍵詞在被搜索內容中出現的次數這樣的函數,我們要自己寫一個UDF(User-Defined Functions),UDF是SQLSERVER的內部函數,可以被存儲過程調用或者被其他UDF調用。函數如下:

1CREATE FUNCTION dbo.WordCount23(@Word VARCHAR(15), 45@Phrase VARCHAR(1000))67RETURNS SMALLINT89AS1011BEGIN1213/**//* 如果@Word 或者@Phrase 為空返回 0 */1415IF @Word IS NULL OR @Phrase IS NULL RETURN 01617/**//* @BiggerWord 比@Word長一個字符 */1819DECLARE @BiggerWord VARCHAR(21)2021SELECT @BiggerWord = @Word + 'x'2223/**//*在 @Phrase用@BiggerWord替換@Word */2425DECLARE @BiggerPhrase VARCHAR(2000)2627SELECT @BiggerPhrase = REPLACE (@Phrase, @Word, @BiggerWord)2829/**//* 相減結果就是出現的次數了 */3031RETURN LEN(@BiggerPhrase) - LEN(@Phrase)3233END34

以上就是整個UDF,它用了一個很高效的方法來計算關鍵詞出現的次數。

二、參數傳遞

用戶輸入的關鍵詞從一個到多個不等,我們可以把參數固定為@word1~@word5,這樣比較方面實現。當用戶輸入超過5個時,忽略不計,少于5個的地方視為空。其實GOOGLE也是這樣做的,只是GOOGLE的最大詞語限制是10個。

三、搜索的實現過程

假定我們對Product表進行搜索,Product字段有:Id,Name ,Descripton(產品描述),搜索要同時對Name 和 Description進行。

Any-World Search實現如下:

1SELECT Product.Name, 2;;;;3 * WordCount(@Word1, Name) + WordCount(@Word1, Description) +34;;;;3 * WordCount(@Word2, Name) + WordCount(@Word2, Description) +56;;;;78;;;;AS Rank9FROM Product1011

這里對Name賦予權重為3,Description為1(大家根據實際情況賦予不同的權重),Rank是計算列,通過前面定義的UDF計算所關鍵詞出現的次數乘上權重等到的。

同樣的All-Word Search實現如下:

1SELECT Product.Name, 23;;;;(3 * WordCount(@Word1, Name) + WordCount(@Word1, Description)) *45;;;;CASE 67; WHEN @Word2 IS NULL THEN 1 89;ELSE 3 * WordCount(@Word2, Name) + WordCount(@Word2, Description)1011;;;;END *1213;;;;1415;;;;AS Rank1617FROM Product18

這時把每個關鍵詞出現的次數相乘只要一個沒出現RANK就為0,為0就是搜索結果為空。

還可以這樣實現:

1SELECT Product.Name, 2;;;;CASE 3 WHEN @Word1 IS NULL THEN 0 4 ELSE ISNULL(NULLIF(dbo.WordCount(@Word1, Name + ' ' + Description), 0), -1000)5;;;;END +6;;;;CASE 7 WHEN @Word2 IS NULL THEN 0 8 ELSE ISNULL(NULLIF(dbo.WordCount(@Word2, Name + ' ' + Description), 0), -1000)9;;;;END +10;;;;11;;;;AS Rank12FROM Product對沒出現的關鍵詞賦值-1000,這樣Rank就肯定為負數,負數表示搜索結果為空。

四、對結果進行分頁

搜索的結果可能很多,對結果分頁可以提高性能。我在如何在數據層分頁以提高性能已經說明了如何用存儲過程進行分頁了,這里就不在詳細復述了。

過程簡單來說就是創建一個臨時表,表中包含行號,讀取時按行號來讀取數據

五、完整代碼

經過前面的分析,完整代碼如下:

1CREATE PROCEDURE SearchCatalog 2(;;; 3 @PageNumber TINYINT, 4 @ProductsPerPage TINYINT, 5 @HowManyResults SMALLINT OUTPUT, 6 @AllWords BIT, 7 @Word1 VARCHAR(15) = NULL, 8 @Word2 VARCHAR(15) = NULL, 9 @Word3 VARCHAR(15) = NULL,10 @Word4 VARCHAR(15) = NULL,11 @Word5 VARCHAR(15) = NULL)12AS13/**//* 創建臨時表,保存搜索的結果(Sql Server2005適用,Sql Server2000見如何在數據層分頁以提高性能) */14DECLARE @Products TABLE15(RowNumber SMALLINT IDENTITY (1,1) NOT NULL,16 ID INT,17 Name VARCHAR(50),18 Description VARCHAR(1000),19Rank INT)2021/**//* Any-words search */22IF @AllWords = 0 23INSERT INTO @Products24SELECT ID, Name, Description,25;;;;;3 * dbo.WordCount(@Word1, Name) + dbo.WordCount(@Word1, Description) +2627;;;;;3 * dbo.WordCount(@Word2, Name) + dbo.WordCount(@Word2, Description) +2829;;;;;3 * dbo.WordCount(@Word3, Name) + dbo.WordCount(@Word3, Description) +3031;;;;;3 * dbo.WordCount(@Word4, Name) + dbo.WordCount(@Word4, Description) +3233;;;;;3 * dbo.WordCount(@Word5, Name) + dbo.WordCount(@Word5, Description) 3435; AS Rank3637FROM Product38ORDER BY Rank DESC3940/**//* all-words search */4142IF @AllWords = 14344INSERT INTO @Products4546SELECT ID, Name, Description,4748; (3 * dbo.WordCount(@Word1, Name) + dbo.WordCount4950(@Word1, Description)) *5152; CASE 5354WHEN @Word2 IS NULL THEN 1 5556ELSE 3 * dbo.WordCount(@Word2, Name) + dbo.WordCount(@Word2, 5758Description)5960; END *6162; CASE 6364WHEN @Word3 IS NULL THEN 1 6566ELSE 3 * dbo.WordCount(@Word3, Name) + dbo.WordCount(@Word3, 6768Description)6970; END *7172; CASE 7374WHEN @Word4 IS NULL THEN 1 7576ELSE 3 * dbo.WordCount(@Word4, Name) + dbo.WordCount(@Word4, 7778Description)7980; END *8182; CASE 8384WHEN @Word5 IS NULL THEN 1 8586ELSE 3 * dbo.WordCount(@Word5, Name) + dbo.WordCount(@Word5, 8788Description)8990; END9192; AS Rank9394FROM Product9596ORDER BY Rank DESC9798/**//* 在外部變量保存搜索結果數 */99100SELECT @HowManyResults = COUNT(*) 101102FROM @Products 103104WHERE Rank > 0105106/**//* 按頁返回結果*/107108SELECT ProductID, Name, Description, Price, Image1FileName,109110 Image2FileName, Rank111112FROM @Products113114WHERE Rank > 0115116; AND RowNumber BETWEEN (@PageNumber-1) * @ProductsPerPage + 1 117118;AND @PageNumber * @ProductsPerPage119ORDER BY Rank DESC

至此一個簡單的搜索算法就實現了。

標簽: Sql Server 數據庫
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
白白色亚洲国产精品| 亚洲一区欧美一区| 亚洲国产一二三| 欧美午夜精品| 久久综合狠狠综合久久综合88| 久久69国产一区二区蜜臀| 色综合久久天天| 日韩在线a电影| 久久最新视频| 另类小说视频一区二区| 日本二三区不卡| 依依成人精品视频| 99视频一区| 一区二区三区四区五区视频在线观看 | 亚洲视频在线观看三级| 国产精品啊v在线| 亚洲欧洲日韩一区二区三区| 黄色免费成人| 亚洲一区二区在线观看视频| 香蕉视频成人在线观看| 日韩 欧美一区二区三区| 欧美日韩一区三区| 国产一区不卡视频| 91精品婷婷国产综合久久竹菊| 国产麻豆日韩欧美久久| 精品毛片乱码1区2区3区| 欧美一区二区三区另类| 亚洲日本乱码在线观看| 免费一级欧美片在线播放| 奇米精品一区二区三区在线观看| 欧美日韩国产一区二区三区地区| 国产福利一区在线观看| 久久久久久久久久久久久久久99 | 欧美国产先锋| 国产欧美精品一区二区三区四区| 欧美午夜精品久久久久免费视| 亚洲男帅同性gay1069| 久久av二区| 精品一区在线看| 2024国产精品视频| 国内精品久久久久久久影视蜜臀| 亚洲卡通欧美制服中文| 久久午夜精品| 国产高清无密码一区二区三区| 日韩女优av电影| 欧美日韩国产综合视频在线| 亚洲私人影院在线观看| 亚洲一区二区三区午夜| 老司机精品视频导航| 91精品国产综合久久香蕉麻豆| 成人久久视频在线观看| 亚洲欧美怡红院| 麻豆91精品| 精品一区二区免费在线观看| 久久久五月婷婷| 亚洲精品婷婷| 精品一区二区三区视频| 久久久精品欧美丰满| 99精品国产一区二区青青牛奶 | 亚洲天堂成人在线观看| 亚洲精品一区二区三区蜜桃久| 三级影片在线观看欧美日韩一区二区 | 久久99深爱久久99精品| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 亚洲欧洲精品一区二区三区| 亚洲综合激情| 国产精品99久久久| 中文字幕欧美一| 在线观看不卡一区| 欧美人成在线| 美腿丝袜亚洲一区| 国产调教视频一区| 久热精品视频| 色综合天天综合色综合av| 亚洲国产视频一区| 欧美不卡在线视频| 亚洲资源av| 成人精品免费视频| 亚洲一区二区视频| 日韩精品最新网址| 亚洲精选91| 国产福利一区在线观看| 亚洲欧美一区二区三区国产精品| 欧美日韩精品免费| 国产一区二区三区四区老人| 免费在线一区观看| 国产精品成人免费| 4438成人网| 国产精品区二区三区日本| 成人午夜视频福利| 五月综合激情日本mⅴ| 久久久久久久性| 在线视频国内一区二区| 欧美在线资源| 久久99国产精品免费| 久久精品亚洲麻豆av一区二区| 久久综合五月| 国产一区视频观看| 国产一区三区三区| 亚洲自拍都市欧美小说| 久久久久久久av麻豆果冻| 久久久久天天天天| 欧美福利一区| 韩国av一区二区| 亚洲在线视频免费观看| 欧美精品一区二区三区一线天视频| 玖玖国产精品视频| 欧美日一区二区在线观看| 国产在线精品不卡| 亚洲午夜三级在线| 国产日韩三级在线| 制服丝袜亚洲精品中文字幕| 亚洲一区免费看| 欧美日韩精品久久| 顶级嫩模精品视频在线看| 日韩高清一级片| 国产精品国产自产拍高清av王其| 91精品国产91久久久久久最新毛片| 国产精品乱码| 欧美午夜精品久久久久免费视| 国产99久久精品| 老司机精品视频在线| 亚洲国产综合人成综合网站| 国产日韩综合av| 日韩一区二区视频| 在线免费观看日韩欧美| 日韩一级网站| 你懂的成人av| 国产成人一区在线| 久久精品国产77777蜜臀| 一二三区精品福利视频| 国产日韩综合av| 精品国产区一区| 欧美精品免费视频| 欧美做爰猛烈大尺度电影无法无天| 国产精品有限公司| 亚洲高清视频一区| 欧美日韩一区二区三| 99久久综合色| 成人精品gif动图一区| 精品一区二区三区免费视频| 婷婷夜色潮精品综合在线| 亚洲免费观看高清完整版在线观看| 久久精品夜夜夜夜久久| 日韩免费在线观看| 91麻豆精品91久久久久久清纯 | 99这里只有久久精品视频| 国产在线视视频有精品| 视频一区视频二区在线观看| 亚洲图片一区二区| 亚洲国产色一区| 亚洲综合在线五月| 亚洲激情中文1区| 国产精品久久久久久久岛一牛影视 | 宅男噜噜噜66国产日韩在线观看| 国产一区二区三区无遮挡| 欧美一区二区视频在线| 99re成人精品视频| 99久久精品99国产精品 | 国内精品国产三级国产a久久| 青青草国产精品亚洲专区无| 五月天丁香久久| 亚洲一区二区影院| 一卡二卡欧美日韩| 亚洲精品日产精品乱码不卡| 1区2区3区欧美| 自拍偷在线精品自拍偷无码专区| 国产精品第13页| 亚洲欧洲韩国日本视频| 日韩毛片视频在线看| 亚洲色大成网站www久久九九| 亚洲欧美日韩中文播放| 亚洲欧美日韩系列| 一区二区国产视频| 亚洲福利一区二区三区| 亚洲一线二线三线久久久| 亚洲综合精品自拍| 午夜一区二区三区视频| 午夜久久久久久久久| 日韩va亚洲va欧美va久久| 精品一区二区三区视频| 国产一区 二区| 成人app在线| 欧美日韩1080p| 亚洲国产专区校园欧美| 久久不射2019中文字幕| 欧美三级视频在线| 欧美zozozo| 国产精品免费av| 亚洲一区二区精品3399| 美女脱光内衣内裤视频久久影院| 国产麻豆成人传媒免费观看| 成人免费视频网站在线观看| 91猫先生在线| 伊人久久婷婷| 国产嫩草一区二区三区在线观看| 一本久久综合亚洲鲁鲁五月天| 欧美精三区欧美精三区| 精品少妇一区二区三区视频免付费| 欧美激情一区不卡|