FullName不是列时按FullName搜索FullText,但具有firstName和LastName

时间:2018-01-11 18:17:04

标签: sql-server sql-server-2012 full-text-search full-text-indexing

我有一个以下查询,我没有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/,但无法使用

2 个答案:

答案 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
       ;

这样,当FirstNameLastName列值更改时,FullName的全文索引将自动更新,并且您提供的所有示例查询都应返回所需的结果。

注意,如果您愿意,甚至可以将Nickname列添加到FullName定义中,它会使您的CONTAINS条件更小,更容易阅读。

我个人认为计算的FTS索引列对于此类任务是最佳的,除非您有限制可能会阻止您添加它。

希望这有帮助。

答案 1 :(得分:0)

您提供的示例只有一个Name列,与您的案例不同。当您要搜索"John Doe"时,全文搜索会获取每列的条件。因此,您应该使用Contains;

创建多个AND
SELECT * FROM [User] WHERE
CONTAINS(FirstName, '"John"') and CONTAINS(LastName, '"Doe"');