我有一个以下查询,我没有fullName字段,但queryText输入可以有fullname。 我通过firstName或lastName搜索工作,但是用户提供它不起作用的名字和姓氏。
@queryText of
John Works
Doe Works
John Doe Does not work
CREATE FULLTEXT INDEX ON [HK].[User]
(
UserName,
FirstName,
LastName,
NickName,
EmailAddress,
WorkPhone
)
KEY INDEX [PK_HK.User]
ON [HKUserCatalog]
WITH CHANGE_TRACKING AUTO ,
STOPLIST = SYSTEM
;
GO
my sql
SELECT TOP(@queryLimit) * FROM [User]
WHERE
CONTAINS((UserName, FirstName, LastName, NickName, EmailAddress, WorkPhone), @queryText)
OR TRY_CONVERT(INT, @queryText) = UserId
Order By FirstName, LastName
;
如何在不向表中添加fullName列的情况下使其工作?我尝试使用http://www.22bugs.co/post/searching-peoples-names-with-sql-server-full-text-search/,但无法使用
答案 0 :(得分:1)
我发现你不想在你的桌子上添加FullName
列,但万一你改变主意,如果你被允许修改你的[HK].User
表,那你就是这样的可以添加一个名为FullName
的计算列,并将其包含在全文索引中:
alter table [HK].[User] add [FullName] as (isnull(FirstName,'') + ' ' + isnull(LastName,''))
alter fulltext index on [HK].[User] disable
alter fulltext index on [HK].[User] add (FullName)
alter fulltext index on [HK].[User] enable
然后在CONTAINS
谓词中包含此列:
SELECT TOP(@queryLimit) * FROM [User]
WHERE
CONTAINS((UserName, FullName, NickName, EmailAddress, WorkPhone), @queryText)
OR TRY_CONVERT(INT, @queryText) = UserId
Order By FirstName, LastName
;
这样,当FirstName
或LastName
列值更改时,FullName
的全文索引将自动更新,并且您提供的所有示例查询都应返回所需的结果。
注意,如果您愿意,甚至可以将Nickname
列添加到FullName
定义中,它会使您的CONTAINS
条件更小,更容易阅读。
我个人认为计算的FTS索引列对于此类任务是最佳的,除非您有限制可能会阻止您添加它。
希望这有帮助。
答案 1 :(得分:0)
您提供的示例只有一个Name
列,与您的案例不同。当您要搜索"John Doe"
时,全文搜索会获取每列的条件。因此,您应该使用Contains
;
AND
SELECT * FROM [User] WHERE
CONTAINS(FirstName, '"John"') and CONTAINS(LastName, '"Doe"');