回答

收藏

T-SQL存储过程可返回谷歌风格的``建议''搜索结果

技术问答 技术问答 294 人阅读 | 0 人回复 | 2023-09-14

好的,使用SQL Server2008。在我的网页上,我有一个带有jQuery-UI AutoComplete的文本框。7 [2 ~- G5 M% w! ^  R9 Y
现在,我需要一个存储过程来搜索单个表(或多个连接的表)的所有列,以查找来自textbox / autocomplete
  _3 `& z( j, I1 GAJAX调用的搜索字符串,并返回“建议”搜索字符串。我正在使用AdventureWorks db进行测试(产品表)# a2 F  ]* f" x
因此,例如,产品表中包含产品名称和产品编号(其中包括其他列)的列,我想根据用户输入返回建议的搜索字符串,他们可以在其中输入产品名称和/或产品编号。* s1 |3 m8 _4 Q; o; {
我在一个单一的列上工作,这很简单。有任何想法吗?
& h# z7 T# \# v0 z: N# O$ ^               
9 N7 E5 L. F3 P; t* \) j2 E解决方案:
# |) i. p, f' c- }6 {9 C+ c( z               
4 u- y. B0 P% E3 s- T! o8 B4 w
9 K; `! Y9 n! u
0 }7 q4 s7 v. `% L                我建议全文搜索(MS’或Lucene可以使用)下面的代码使用MSSQL FTS作为其目前在我的应用程序中使用的代码。6 D$ c) F- V; v1 P
如果尚未安装FTS Search,请先安装。如果已检查该服务正在运行。在管理工作室中,运行它来设置目录并添加产品表;和颜色/名称/产品编号到目录。7 J3 b+ Q( b. }4 u2 B$ D3 m0 @* u
USE [AdventureWorks]% ^9 R7 t& f* Y0 U" J
GO. {  c  y1 d1 L7 f. o7 {
CREATE FULLTEXT CATALOG [ProductsTest]WITH ACCENT_SENSITIVITY = OFF
* z) b8 @- X8 H- T2 N, o, sAUTHORIZATION [dbo]
7 Q/ h% D4 n& y# L! aGO
) j% Z7 Q. u. }. c$ z' JUSE [AdventureWorks]% D# @$ }/ v- x) E+ _
GO- b% k# w" z0 u  }+ g" {
CREATE FULLTEXT INDEX ON [Production].[Product] KEY INDEX [PK_Product_ProductID] ON ([ProductsTest]) WITH (CHANGE_TRACKING AUTO)
2 w* W1 H+ f5 m$ C3 `, XGO
9 m: C- j/ t2 h: a, u, g/ y7 q  _USE [AdventureWorks]1 p$ m' U1 W2 A0 i8 Y8 v
GO
' S) r4 K4 A. `1 \% f% [ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([Color])
. C2 D, R# W% k/ ~1 HGO
3 W3 i% {! X1 Y1 C# J5 ?USE [AdventureWorks]
$ I# Z& ?0 `2 a1 O3 zGO; |9 ]2 d& ?0 E# d5 B/ M
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([Name])
! _+ s8 n1 f8 M3 NGO
( G' W0 I3 R& V- q% v/ dUSE [AdventureWorks]/ L" S( \& r1 @) ~' h3 ~
GO2 T2 m$ K5 w: x* w  J% w
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([ProductNumber])
+ c0 [  R& Z& M: UGO" ]5 s; N! u* _& ^
USE [AdventureWorks]  i4 S+ A3 d0 h, f4 L! I
GO
6 K3 O/ u! G2 a( ?ALTER FULLTEXT INDEX ON [Production].[Product] ENABLE
1 R0 m$ u1 p1 E/ Y. Y+ b/ RGO( n* Y4 ^' p% F/ Q8 B0 J8 T' G
然后,您可以一次对所有列运行查询;例如银(颜色和名称均由其选择)% e, O' e) `) @
Select * from production.product where$ ~  n' B) X: r! }" z
contains(*, '"Silver*"')- T+ h% q$ _0 _" c
查询中的会找到Silver ,因此您可以在用户输入内容时使用它来建立结果。要考虑的一件事是Google实时进行这项工作-; o0 W1 v/ l# A/ w3 b
如果您要搜索大量数据,则可以在不中断用户输入的情况下取回数据。我认为一般来说,人们通过从他们要查找的第一个字母开始键入来使用这些搜索-我接受会有拼写错误-
6 X+ ]) l2 t, X! s您可以在他们按下可能要处理的每个空格后实施一个拼写检查器。或存储运行的搜索并查看拼写错误,然后更改代码以根据映射(或在使用自定义同义词库的FTS中)进行处理。; m' S$ L. f2 n% f8 J' S
排名对于任何企业来说都是一个有趣的发展问题;您是在寻找Mountain Frame的第一个结果-
, |  j4 @/ m# g0 x8 C还是要按销售量或价格对它们进行加权?如果用户键入多个文本词,则可以使用FTS根据搜索字符串生成排名。
2 h6 ?8 `' Z- _# U; dselect aa.rank, bb.* + _& |8 j9 D8 r+ E9 Q
From containstable(production.product, *, '"Mountain" and "Silver*"') aa) q6 \- x4 |& X# N; T  H# \
inner join production.product bb3 H  x2 H; I! n9 ^
on aa.[key] = bb.productid
4 K( V2 O7 P8 V# f1 z1 |  y" horder by rank desc
$ Y2 R7 w- a8 j. t+ y, a: |返回30行;根据用户输入的文本权重确定第一名记录。无论哪种情况,您都可能希望添加编码排名以调整结果以适合您的业务需求-# Z/ r) Z) k" L
定价最高的小部件1可能不是这样。这就是为什么您要存储人们搜索/点击的内容,以便以后可以分析结果的原因。% e( e5 {7 U! ~& G- p1 a
.Net有一个非常不错的语言解析器,可以将输入的Google样式字符串查询转换为FTS’able语言,从而使使用您网站的布尔搜索更加熟悉。
+ Z8 B/ B3 M5 g. D- w. k您可能还想通过对用户输入的内容进行审核并最终去访问并使用成功图来更改最终建议,以使其真正与用户相关,从而增加一些人群功能。  o7 N# K- L; n# z; o( q
作为一个最终的建议,如果这是一个商业网站,您可能想看看Easyask,它是一个令人恐惧的出色自然语言处理程序
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则