我有一个下面的查询,我没有 fullName 字段,但 queryText 输入可以有 fullname。 我按名字或姓氏进行搜索有效,但用户同时提供名字和姓氏则不起作用。
@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 列的情况下使其工作?
我发现您不想将
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 索引列最适合此类任务,除非您有可能阻止您添加它的限制。
希望这有帮助。
您提供的示例只有一列
Name
,与您的情况不一样。当您想要搜索 "John Doe"
时,全文搜索会获取每列的条件。因此,您应该使用 Contains
;创建多个
AND
SELECT * FROM [User] WHERE
CONTAINS(FirstName, '"John"') and CONTAINS(LastName, '"Doe"');