SQL匹配多字段进行排序,搜索
??? 談到搜索,一般就想起了SQL Server的FullTextSearch(全文搜索)功能,它確實強大,但使用起來也要做一些較為繁瑣的準備工作,一般小型的項目或者對搜索要求(包括性能需求)不是很高的情況下實用它還是有點太重型了。簡單的搜索用SQL查詢即可,但一般面臨的一個問題就是如何對搜索結果按匹配字段進行優先級排序。
??? 例如有個產品表(Products),它的字段包:括產品ID、產品名稱、產品類別、產品品牌、產品簡介、產品詳細介紹。
| 字段 | 類型 |
| ProdID | int |
| ProdName | nvarchar |
| CategoryName | nvarchar |
| ProdBrand | nvarchar |
| ProdIntro | nvarchar |
| ProdDescription | nvarchar |
? 現在我們要求通過某個關鍵字從Products表中搜索包含該關鍵字的記錄,凡是以下任何一個字段包含該關鍵字的記錄都列出來:ProdName, CategoryName , ProdBrand, ProdIntro, ProdDescription。 并且搜索結果按照前述字段的匹配優先級進行排序:
? 1)先列出字段ProdName匹配關鍵字的記錄,然后列出字段CategoryName匹配關鍵字的記錄,依此類推,最后列出字段ProdDescription匹配關鍵字的記錄;
? 2)在字段ProdName匹配關鍵字的所有記錄中,先列出字段CategoryName也匹配關鍵字的記錄,然后列出字段ProdBrand也匹配關鍵字的記錄,依次類推…
? 3)按照規則2遞歸排序每個記錄分組……
? 搜索匹配該關鍵字的所有記錄的SQL語句倒很簡單:
? 但對搜索出的結果進行匹配優先級排序稍微有點困難。在用簡單的SQL進行搜索時有兩種方式來達到這個排序的目的:加權法和多字段排序法(我瞎取的名字^-^)。
一、加權法
對搜索的每條記錄計算出一個排序權值來,然后將所有搜索結果按照這個排序權值進行降序排列即可。每條被搜索出的記錄的排序權值為該記錄所有字段的權值之和。某個字段的權值取決于該字段是否匹配關鍵字,如果不匹配則為0,如果匹配則為改字段的匹配權值。字段的匹配權值計算方式為:
fieldPriority = 2的i次冥(i為該字段在所有被搜索的字段優先級排序中倒排的位置)
例如,在我們示例中各字段的匹配權值為:
| 字段 | 倒排位置 | 匹配權值 |
| ProdName | 4 | 16 |
| CategoryName | 3 | 8 |
| ProdBrand | 2 | 4 |
| ProdIntro | 1 | 2 |
| ProdDescription | 0 | 1 |
??? 之所以采用這種算法,是為了確保某個字段匹配的記錄的排序權值不會低于另外一條不匹配該字段但后續字段都匹配的記錄的排序權值。例如記錄A中僅僅ProdName匹配關鍵字,所以它的排序權值為16,而記錄B中除了字段ProdName外其他字段都匹配,則其排序權值為15(8+4+2+1=15)。但記錄A仍然會排在記錄B前面。
?? 相應的SQL大致如下:?
二、多字段排序法
???? 加權法實在是有點啰嗦,倒不如直接利用SQL可以對多個字段進行排序來實現更清晰更直接。實際上我們把每個字段是否匹配的權值分散到SQL的Order里即可,大致SQL如下:
總結
以上是生活随笔為你收集整理的SQL匹配多字段进行排序,搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 其实不然的飞鸽传书
- 下一篇: SQL Server 2005异地备份