多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 數(shù)據(jù)庫 > Sqlserver > 搜索結(jié)果按匹配字段進(jìn)行排序

搜索結(jié)果按匹配字段進(jìn)行排序

來源:程序員人生   發(fā)布時(shí)間:2014-02-05 03:27:48 閱讀次數(shù):3950次
談到搜索,一般就想起了SQL Server的FullTextSearch(全文搜索)功能,它確實(shí)強(qiáng)大,但使用起來也要做一些較為繁瑣的準(zhǔn)備工作,一般小型的項(xiàng)目或者對搜索要求(包括性能需求)不是很高的情況下實(shí)用它還是有點(diǎn)太重型了。簡單的搜索用SQL查詢即可,但一般面臨的一個(gè)問題就是如何對搜索結(jié)果按匹配字段進(jìn)行優(yōu)先級排序

    例如有個(gè)產(chǎn)品表(Products),它的字段包:括產(chǎn)品ID、產(chǎn)品名稱產(chǎn)品類別、產(chǎn)品品牌、產(chǎn)品簡介、產(chǎn)品詳細(xì)介紹

字段 類型
ProdID int
ProdName nvarchar
CategoryName nvarchar
ProdBrand nvarchar
ProdIntro nvarchar
ProdDescription nvarchar

  現(xiàn)在我們要求通過某個(gè)關(guān)鍵字從Products表中搜索包含該關(guān)鍵字的記錄,凡是以下任何一個(gè)字段包含該關(guān)鍵字的記錄都列出來:ProdName, CategoryName , ProdBrand, ProdIntro, ProdDescription。 并且搜索結(jié)果按照前述字段的匹配優(yōu)先級進(jìn)行排序:

  1)先列出字段ProdName匹配關(guān)鍵字的記錄,然后列出字段CategoryName匹配關(guān)鍵字的記錄,依此類推,最后列出字段ProdDescription匹配關(guān)鍵字的記錄;

  2)在字段ProdName匹配關(guān)鍵字的所有記錄中,先列出字段CategoryName也匹配關(guān)鍵字的記錄,然后列出字段ProdBrand也匹配關(guān)鍵字的記錄,依次類推…

  3)按照規(guī)則2遞歸排序每個(gè)記錄分組……

  搜索匹配該關(guān)鍵字的所有記錄的SQL語句倒很簡單:

SELECT * from Products WHERE ProdName like ‘%KeyWord%' or CategoryName like ‘%KeyWord%' or ProdBrand like ‘%KeyWord%' or ProdIntro like ‘%KeyWord%' or ProdDescription like ‘%KeyWord%'

  但對搜索出的結(jié)果進(jìn)行匹配優(yōu)先級排序稍微有點(diǎn)困難。在用簡單的SQL進(jìn)行搜索時(shí)有兩種方式來達(dá)到這個(gè)排序的目的:加權(quán)法多字段排序法(我瞎取的名字^-^)。

一、加權(quán)法

 對搜索的每條記錄計(jì)算出一個(gè)排序權(quán)值來,然后將所有搜索結(jié)果按照這個(gè)排序權(quán)值進(jìn)行降序排列即可。每條被搜索出的記錄的排序權(quán)值為該記錄所有字段的權(quán)值之和。某個(gè)字段的權(quán)值取決于該字段是否匹配關(guān)鍵字,如果不匹配則為,如果匹配則為改字段的匹配權(quán)值。字段的匹配權(quán)值計(jì)算方式為:

   fieldPriority = 2的i次冥i為該字段在所有被搜索的字段優(yōu)先級排序中倒排的位置

 例如,在我們示例中各字段的匹配權(quán)值為:

字段

倒排位置

匹配權(quán)值

ProdName

16

CategoryName

8

ProdBrand

4

ProdIntro

2

ProdDescription

1

    之所以采用這種算法,是為了確保某個(gè)字段匹配的記錄的排序權(quán)值不會低于另外一條不匹配該字段后續(xù)字段都匹配的記錄的排序權(quán)值。例如記錄A中僅僅ProdName匹配關(guān)鍵字,所以它的排序權(quán)值為16,而記錄B中除了字段ProdName外其他字段都匹配,則其排序權(quán)值為15(8+4+2+1=15)。但記錄A仍然會排在記錄B前面。

   相應(yīng)的SQL大致如下:

SELECT *, (
                     (case when charIndex(ProdName,KeyWord)>-1 then 16 else 0 end) +
                     (case when charIndex(CategoryName,KeyWord)>-1 then 8 else 0 end) +
                     (case when charIndex(ProdBrand,KeyWord)>-1 then 4 else 0 end) +
                     (case when charIndex(ProdIntro,KeyWord)>-1 then 2 else 0 end) +
                     (case when charIndex(ProdDescription,KeyWord)>-1 then 1 else 0 end)
                  )  as OrderPriority

from Products
WHERE ProdName like ‘%KeyWord%' or
            CategoryName like ‘%KeyWord%' or
            ProdBrand like ‘%KeyWord%' or
            ProdIntro like ‘%KeyWord%' or
            ProdDescription like ‘%KeyWord%'
Order by OrderPriority desc

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 波多野结衣一区二区三区88 | 国产精品jlzz视频 | 欧美同志的免费video | 成人资源在线观看 | 欧美日韩亚洲国内综合网俺 | 在线观看亚洲精品专区 | 日本成人高清视频 | 亚洲成人黄色网址 | 欧美日韩xxx | 精品综合一区二区三区 | 一区二区三区精品国产 | 用劲好爽再深点视频 | 99热成人精品国产免男男 | 91精品一区二区三区在线播放 | 波多野结衣视频一区 | 国产精品亚洲精品观看不卡 | 色偷偷亚洲女人天堂观看欧 | 亚洲资源最新版在线观看 | 国产福利不卡视频在免费播放 | 另类小说 亚洲 | 欧美夜色 | 欧美日韩国产成人综合在线 | 国产精品高清一区二区三区不卡 | 国产精品毛片一区二区三区 | 国产欧美成人免费观看 | 久久国产精品久久久久久 | 欧美18videosex性欧美tube1080 | 日本一区视频在线播放 | 国产免费不卡v片在线观看 国产免费叼嘿视频 | 伊人网在线视频 | 国产一区二区在线不卡 | 国99久9在线 | 免费 | 波多野结衣一区2区3区 | 精品国产一区二区三区免费 | 欧美一级乱妇老太婆特黄 | 美女免费网站在线视频 | www.羞羞| 日本免费一区二区三区最新vr | 亚洲春色www | 国产女人在线视频 | 亚洲日本在线观看视频 |