2017-05-19 82 views
0

目標:返回基於搜索3個不同列的結果,每個列都有自己的搜索字符串值,並且如果可能,請按RANK排序。SQL Server使用FREETEXTABLE搜索多個列

規則

  1. 允許被搜索任何
  2. 結果必須包含在各自的列中的所有搜索字符串,除非null傳遞
  3. IF 所有搜索字符串爲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結果,但後來我想到了用RANK代替。經過更多的研究,我發現最好使用FREETEXTTABLE。在這一點上,我不確定如何最好地處理我的情況,因爲大多數結果總是談論在多列中搜索一個字符串。

我不完全確定這是如何工作的,但我想我想要搜索所有列的最高組合RANK

如果這是可能的,請給我一些例子。

回答

0

因此經過很多測試後,我認爲我喜歡這個結果。我是INNER JOIN所需的columnInstitutionName)和LEFT OUTER JOIN其他。然後結合他們在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