2016-04-08 111 views
5

我用来使用Lucene进行全文搜索,它工作得很好,但我的主数据库是SQL。我不喜欢有两种数据库机制的想法,并决定使用SQL全文搜索。事情很好,但还有一些我还没有想出来的东西。 可以说我有如下表:SQL全文搜索结果优先

enter image description here

所有字段建立索引全文搜索。

现在我想在这张桌子上用文字“Isaac”进行全文检索。我希望第5行位于顶部,其余结果低于此位。 我可以如何设置一个领域的优先级,以便在该领域找到的任何东西将停留在结果的顶部?基本上我想在现场优先考虑。在我的真实表格中,我有6个字段。

+0

您正在使用哪种类型的数据库? –

+0

@ Mr.P我正在使用MS SQL – Dilshod

回答

1

据我知道MSSQL不支持字符串相似度比较..你必须写自己的函数集

-- get percentage diff 
CREATE FUNCTION [dbo].[GetPercentageOfTwoStringMatching] 
(
    @string1 NVARCHAR(100) 
    ,@string2 NVARCHAR(100) 
) 
RETURNS INT 
AS 
BEGIN 

    DECLARE @levenShteinNumber INT 

    DECLARE @string1Length INT = LEN(@string1) 
    , @string2Length INT = LEN(@string2) 
    DECLARE @maxLengthNumber INT = CASE WHEN @string1Length > @string2Length THEN @string1Length ELSE @string2Length END 

    SELECT @levenShteinNumber = [dbo].[LEVENSHTEIN] ( @string1 ,@string2) 

    DECLARE @percentageOfBadCharacters INT = @levenShteinNumber * 100/@maxLengthNumber 

    DECLARE @percentageOfGoodCharacters INT = 100 - @percentageOfBadCharacters 

    -- Return the result of the function 
    RETURN @percentageOfGoodCharacters 

END 

-- get diff of strings 
CREATE FUNCTION [dbo].[LEVENSHTEIN](@left VARCHAR(100), 
            @right VARCHAR(100)) 
returns INT 
AS 
    BEGIN 
     DECLARE @difference INT, 
       @lenRight  INT, 
       @lenLeft  INT, 
       @leftIndex  INT, 
       @rightIndex INT, 
       @left_char  CHAR(1), 
       @right_char CHAR(1), 
       @compareLength INT 

     SET @lenLeft = LEN(@left) 
     SET @lenRight = LEN(@right) 
     SET @difference = 0 

     IF @lenLeft = 0 
     BEGIN 
      SET @difference = @lenRight 

      GOTO done 
     END 

     IF @lenRight = 0 
     BEGIN 
      SET @difference = @lenLeft 

      GOTO done 
     END 

     GOTO comparison 

     COMPARISON: 

     IF (@lenLeft >= @lenRight) 
     SET @compareLength = @lenLeft 
     ELSE 
     SET @compareLength = @lenRight 

     SET @rightIndex = 1 
     SET @leftIndex = 1 

     WHILE @leftIndex <= @compareLength 
     BEGIN 
      SET @left_char = substring(@left, @leftIndex, 1) 
      SET @right_char = substring(@right, @rightIndex, 1) 

      IF @left_char <> @right_char 
       BEGIN -- Would an insertion make them re-align? 
        IF(@left_char = substring(@right, @rightIndex + 1, 1)) 
        SET @rightIndex = @rightIndex + 1 
        -- Would an deletion make them re-align? 
        ELSE IF(substring(@left, @leftIndex + 1, 1) = @right_char) 
        SET @leftIndex = @leftIndex + 1 

        SET @difference = @difference + 1 
       END 

      SET @leftIndex = @leftIndex + 1 
      SET @rightIndex = @rightIndex + 1 
     END 

     GOTO done 

     DONE: 

     RETURN @difference 
    END 

,然后你会被

SELECT * 
FROM [dbo].[some_table] 
ORDER BY [dbo].[GetPercentageOfTwoStringMatching](col1 ,col2) DESC 
添加到您的订单

它适应您的DTB但是这应该为你


工作,或者你可以设置简单的CA SE WHEN条件创建订单列

SELECT * 
FROM [dbo].[table] 
ORDER BY 
     CASE 
      WHEN str = 'search_string' THEN 1 
      WHEN str LIKE '%search_string%' THEN 2 
      ELSE 3 
     END