0

目标:如果可能,根据对 3 个不同列的搜索返回结果,每个列都有自己的搜索字符串值和排序依据RANK

规则

  1. 允许搜索任何
  2. 结果必须包含各自列上的所有搜索字符串,除非null通过
  3. 如果所有搜索字符串都是null,则返回空结果

当前存储过程:

为了遵守上述规则,我经过大量研究后能够提出这一点。

ALTER PROCEDURE [Application].[usp_Institution_Search] 
    @RowCount INT = 100,
    @Name NVARCHAR(255), 
    @City NVARCHAR(255),
    @Country NVARCHAR(255) 
AS
BEGIN
    SET NOCOUNT ON;

    IF ISNULL(@Name, '') = '' SET @Name = '""' 
    IF ISNULL(@City, '') = '' SET @City = '""' 
    IF ISNULL(@Country, '') = '' SET @Country = '""' 

    SELECT TOP (@RowCount) 
        [i].* 
    FROM 
        [dbo].[Institutions] [i] 
    WHERE 
        ((NULLIF(@Name, '""') IS NULL OR FREETEXT([i].[InstitutionName], @Name)) 
        AND (NULLIF(@City, '""') IS NULL OR FREETEXT([i].[City], @City)) 
        AND (NULLIF(@Country, '""') IS NULL OR FREETEXT([i].[Country], @Country)) 
        AND 
        (
             NULLIF(@Name, '""') IS NOT NULL 
             OR NULLIF(@City, '""') IS NOT NULL 
             OR NULLIF(@Country, '""') IS NOT NULL)
        ) 
END

问题:我正要订购结果,InstitutionName但后来我考虑使用 aRANK代替。经过更多研究,我发现最好使用FREETEXTTABLE. 在这一点上,我不确定如何最好地处理我的情况,因为大多数结果总是谈论在多个列中搜索一个字符串。

我不完全确定这是如何工作的,但我想我希望RANK从所有列的搜索中获得最高的组合。

如果这是可能的,请给我一些例子。

4

1 回答 1

0

所以经过大量测试后,我想我喜欢这个结果。我正在INNER JOINing 所需的column( InstitutionName) 和LEFT OUTER JOINing 其他人。然后将他们的行列组合起来ORDER BY

我不确定它是否尽可能高效。如果有人有任何意见,我很乐意听取您的意见,因为我总是想了解更多信息。

ALTER PROCEDURE [Application].[usp_Institution_Search] 
    @RowCount INT = 100,
    @Name NVARCHAR(255), 
    @City NVARCHAR(255),
    @Country NVARCHAR(255) 
AS
BEGIN
    SET NOCOUNT ON;

    IF ISNULL(@Name, '') = '' SET @Name = '""' 
    IF ISNULL(@City, '') = '' SET @City = '""' 
    IF ISNULL(@Country, '') = '' SET @Country = '""' 

    SELECT TOP (@RowCount) 
        [i].* 
    FROM 
        [dbo].[Institutions] [i] 
        INNER JOIN FREETEXTTABLE([Institutions], [InstitutionName], @Name) AS [ft1] ON [ft1].[Key] = [i].[InstitutionId] 
        LEFT OUTER JOIN FREETEXTTABLE([Institutions], [City], @City) AS [ft2] ON [ft2].[Key] = [i].[InstitutionId] 
        LEFT OUTER JOIN FREETEXTTABLE([Institutions], [Country], @Country) AS [ft3] ON [ft3].[Key] = [i].[InstitutionId] 
    ORDER BY 
        [ft1].[Rank] + ISNULL([ft2].[Rank], 0) + ISNULL([ft3].[Rank], 0) DESC 
        , [i].[InstitutionName] ASC 
END
于 2017-05-24T13:53:19.763 回答