如何按相关性查询SQL Server 2008数据库的名字和姓氏和顺序?

Dav*_*och 5 sql t-sql sql-server sql-server-2008

基本上我有这样一个表:

CREATE TABLE Person(
    PersonID int IDENTITY(1,1) NOT NULL,
    FirstName nvarchar(512) NOT NULL,
    LastName nvarchar(512) NULL
)
Run Code Online (Sandbox Code Playgroud)

我需要根据用户查询找到前n个结果,如下所示:

"Joh Smi"
Run Code Online (Sandbox Code Playgroud)

以下查询返回我需要的结果(我认为).只是不在相关的顺序.

SELECT
    PersonID, FirstName, LastName
FROM
    Person
WHERE
    FirstName LIKE 'Joh%' OR
    LastName LIKE 'Joh%' OR
    FirstName LIKE 'Smi%' OR
    LastName LIKE 'Smi%'
Run Code Online (Sandbox Code Playgroud)

如果以下名称在数据库中并且我们的用户查询是"Joh Smi",则名称应按以下顺序出现(或类似)

  1. 约翰·史密斯
  2. 约翰尼史密斯
  3. 约翰雅各布
  4. 大卫史密森尼
  5. Daniel Johnson

我希望它能像facebook的自动完成朋友搜索一样工作.

那么,如何在SQL Server 2008中返回前n个最相关的行?

OMG*_*ies 5

我建议实施全文搜索(FTS)有两个原因:

  1. 简化查询(不应该需要OR,这将表现不佳)
  2. 利用FTS排名功能 - 请参阅此文章


mel*_*dek 2

作为 OMG 小马答案的附录......

为了从全文搜索中获得最佳结果,您可能需要创建一个连接名字和姓氏字段的索引视图。

这将使您能够更精确地衡量全名的各个部分。

示例代码如下:

    CREATE VIEW [dbo].[vFullname] WITH SCHEMABINDING AS
    SELECT personID, FirstName + ' ' + LastName AS name 
    FROM dbo.person 

    WITH ranks AS(
    SELECT FT_TBL.personid 
        ,FT_TBL.name
        ,KEY_TBL.RANK
    FROM dbo.vfullname AS FT_TBL 
        INNER JOIN CONTAINSTABLE(vfullname, (name),
    'ISABOUT ("Smith" WEIGHT (0.4), "Smi*" WEIGHT (0.2),
"John" WEIGHT (0.3), "Joh*" WEIGHT (0.1))') AS KEY_TBL  
          ON FT_TBL.personid = KEY_TBL.[KEY]
    ) 
    SELECT
    r.personID,
    p.firstname,
    p.lastname,
    r.rank
    FROM ranks r INNER JOIN
    person p ON r.personID = p.personID
    ORDER BY rank DESC;
Run Code Online (Sandbox Code Playgroud)

CTE 仅允许您返回单独的名字和姓氏字段。如果您不需要这些作为输出,请忽略它。