2016-04-08 8 views
5

Ich bin gewohnt, Lucene für die Volltextsuche zu verwenden, und es war großartig, aber meine Hauptdatenbank war SQL. Ich mochte die Idee, zwei Mechanismen für die Datenbank zu haben, nicht und entschied mich für die SQL-Volltextsuche. Die Dinge funktionieren großartig, aber es gibt immer noch einige Dinge, die ich nicht herausgefunden habe. Lets sagen, dass ich in der folgenden Tabelle haben:SQL Volltext Suche Ergebnis Priorität

enter image description here

Alle Felder sind für die Volltextsuche indiziert.

Jetzt möchte ich die Volltextsuche in dieser Tabelle mit dem Text "Isaac". Und ich möchte, dass die Reihe 5 oben steht und der Rest der Ergebnisse darunter liegt. Kann ich festlegen, wie ein Feld Priorität erhält, damit alles, was in diesem Feld gefunden wird, am Anfang des Ergebnisses bleibt? Grundsätzlich möchte ich es nach dem Feld priorisieren. In meiner realen Tabelle habe ich 6 Felder.

+0

Welche Art von DB verwenden Sie? –

+0

@ Mr.P Ich benutze MS SQL – Dilshod

Antwort

1

Soweit ich weiß, MSSQL nicht String Ähnlichkeitsvergleich unterstützt .. Sie haben Ihren eigenen Satz von Funktionen

-- 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 

zu schreiben und dann werden Sie dies durch

SELECT * 
FROM [dbo].[some_table] 
ORDER BY [dbo].[GetPercentageOfTwoStringMatching](col1 ,col2) DESC 
zu Ihrer Bestellung hinzufügen

passen Sie es Ihren DTB aber dies sollte


Oder Sie können einfach CA für Sie arbeiten setzen SE WHEN Bedingung zum Erstellen der Auftragspalte

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