2016-04-08 20 views
5

フルテキスト検索にLuceneを使用していましたが、うまく機能しましたが、メインデータベースはSQLでした。私はデータベースの2つのメカニズムを持つという考えが嫌いで、SQLのフルテキスト検索を使用することに決めました。物事はうまくいっていますが、まだ分かっていないことがいくつかあります。SQLフルテキスト検索結果の優先度

enter image description here

すべてのフィールドは、フルテキスト検索のためのインデックスが作成されています は、私は以下の表を考えてみましょう。

今、私はこのテーブルのテキスト "Isaac"で全文検索をしたいと思います。そして、私は5行目が上にあり、結果の残りがその下にあることを望みます。 フィールドに優先順位を設定して、そのフィールドにあるものが結果の先頭に残るようにする方法はありますか?基本的に私はフィールドでそれを優先したいと思います。私の実際のテーブルには6つのフィールドがあります。

+0

使用しているDBのタイプは何ですか? –

+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