当 FullName 不是列,但具有名字和姓氏时,按 FullName 进行全文搜索

问题描述 投票:0回答:2

我有一个下面的查询,我没有 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 列的情况下使其工作?

sql-server sql-server-2012 full-text-search
2个回答
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 索引列最适合此类任务,除非您有可能阻止您添加它的限制。

希望这有帮助。


0
投票

您提供的示例只有一列

Name
,与您的情况不一样。当您想要搜索
"John Doe"
时,全文搜索会获取每列的条件。因此,您应该使用
Contains
;
 创建多个 
AND

SELECT * FROM [User] WHERE
CONTAINS(FirstName, '"John"') and CONTAINS(LastName, '"Doe"');
© www.soinside.com 2019 - 2024. All rights reserved.