Frage

Wir haben eine Web-Anwendung, die SQL Server 2008 als Datenbank verwendet. Unsere Benutzer sind in der Lage eine Volltextsuche auf bestimmte Spalten in der Datenbank zu tun. SQL Server Volltext-Funktionalität scheint nicht, Unterstützung für Trefferhervorhebung. Müssen wir diese selbst bauen oder gibt es vielleicht einige Bibliothek oder das Wissen um, wie dies zu tun?

BTW die Anwendung in C # geschrieben, so eine .NET-Lösung wäre ideal, aber nicht notwendig, da wir übersetzen könnten.

War es hilfreich?

Lösung

Der Ausbau auf Ismaels Idee, es ist nicht die endgültige Lösung, aber ich denke, es ist ein guter Weg zu beginnen.

Zunächst müssen wir die Liste der Wörter erhalten, die mit dem Volltext-Engine abgerufen wurden:

declare @SearchPattern nvarchar(1000) = 'FORMSOF (INFLECTIONAL, " ' + @SearchString + ' ")' 
declare @SearchWords table (Word varchar(100), Expansion_type int)
insert into @SearchWords
select distinct display_term, expansion_type
from sys.dm_fts_parser(@SearchPattern, 1033, 0, 0)
where special_term = 'Exact Match'

Es ist schon ziemlich viel man auf erweitern kann, zum Beispiel des Suchmuster ist recht einfach; auch gibt es wahrscheinlich bessere Möglichkeiten, die Worte, um herauszufiltern Sie nicht brauchen, aber es am wenigsten gibt es Ihnen eine Liste der Stammwörter, etc., die Volltextsuche angepasst werden würde.

Nachdem Sie die Ergebnisse, die Sie benötigen, können Sie RegEx verwenden können, durch die Ergebnismenge zu analysieren (oder vorzugsweise nur eine Teilmenge um ihn zu beschleunigen, obwohl ich noch nicht einen guten Weg gefunden, dies zu tun). Dazu habe ich einfach zwei While-Schleifen verwenden und eine Reihe von temporärer Tabelle und Variablen:

declare @FinalResults table 
while (select COUNT(*) from @PrelimResults) > 0
begin
    select top 1 @CurrID = [UID], @Text = Text from @PrelimResults
    declare @TextLength int = LEN(@Text )
    declare @IndexOfDot int = CHARINDEX('.', REVERSE(@Text ), @TextLength - dbo.RegExIndexOf(@Text, '\b' + @FirstSearchWord + '\b') + 1)
    set @Text = SUBSTRING(@Text, case @IndexOfDot when 0 then 0 else @TextLength - @IndexOfDot + 3 end, 300)

    while (select COUNT(*) from @TempSearchWords) > 0
    begin
        select top 1 @CurrWord = Word from @TempSearchWords
        set @Text = dbo.RegExReplace(@Text, '\b' + @CurrWord + '\b',  '<b>' + SUBSTRING(@Text, dbo.RegExIndexOf(@Text, '\b' + @CurrWord + '\b'), LEN(@CurrWord) + 1) + '</b>')
        delete from @TempSearchWords where Word = @CurrWord
    end

    insert into @FinalResults
    select * from @PrelimResults where [UID] = @CurrID
    delete from @PrelimResults where [UID] = @CurrID
end

Mehr Hinweise:
1. Verschachtelte while-Schleifen sind wahrscheinlich nicht die effizienteste Art und Weise, es zu tun, aber es kommt nichts anderes in den Sinn. Wenn ich Cursor verwenden, wäre es im Wesentlichen dasselbe sein?
2. @FirstSearchWord hier bezieht sich auf die ersten Instanz im Text von einem der ursprünglichen Suchworte, so im Wesentlichen der Text, den Sie ersetzt werden, wird nur in der Zusammenfassung gehen zu sein. Wieder ist es eine ziemlich grundlegende Methode, würde eine Art von Text-Cluster-Algorithmus zu finden, wahrscheinlich nützlich sein.
3. Um RegEx in erster Linie zu erhalten, müssen Sie CLR benutzerdefinierte Funktionen.

Andere Tipps

Es sieht aus wie Sie die Ausgabe der neuen SQL Server 2008 gespeichert rel="nofollow Verfahren sys.dm_fts_parser und Verwendung regex, aber ich habe nicht auf sie zu eng aussehen.

Sie können den Punkt der Datenbank in diesem Fall fehlen. Seine Aufgabe ist es, die Daten an Sie zurück, dass die Bedingungen erfüllt Sie ihn gegeben hat. Ich glaube, Sie wollen die Markierung wahrscheinlich mit regex in Ihrer Web-Steuerung implementieren.

Hier ist etwas eine schnelle Suche offenbaren würde.

http: //www.dotnetjunkies .com / PrintContent.aspx? type = Artikel & id = 195E323C-78F3-4884-A5AA-3A1081AC3B35

Einige Details:

            search_kiemeles=replace(lcase(search),"""","")
            do while not rs.eof  'The search result loop
                hirdetes=rs("hirdetes")
                data=RegExpValueA("([A-Za-zöüóőúéáűíÖÜÓŐÚÉÁŰÍ0-9]+)",search_kiemeles)   'Give back all the search words in an array, I need non-english characters also
                For i=0 to Ubound(data,1)
                    hirdetes = RegExpReplace(hirdetes,"("&NoAccentRE(data(i))&")","<em>$1</em>")
                Next
                response.write hirdetes
                rs.movenext
            Loop
            ...

Funktionen

'All Match to Array
Function RegExpValueA(patrn, strng)
    Dim regEx
    Set regEx = New RegExp   ' Create a regular expression.
    regEx.IgnoreCase = True   ' Set case insensitivity.
    regEx.Global = True
    Dim Match, Matches, RetStr
    Dim data()
    Dim count
    count = 0
    Redim data(-1)  'VBSCript Ubound array bug workaround
    if isnull(strng) or strng="" then
        RegExpValueA = data
        exit function
    end if
    regEx.Pattern = patrn   ' Set pattern.
    Set Matches = regEx.Execute(strng)   ' Execute search.
    For Each Match in Matches   ' Iterate Matches collection.
        count = count + 1
        Redim Preserve data(count-1)
      data(count-1) = Match.Value
    Next
    set regEx = nothing
    RegExpValueA = data
End Function

'Replace non-english chars
Function NoAccentRE(accent_string)
    NoAccentRE=accent_string
    NoAccentRE=Replace(NoAccentRE,"a","§")
    NoAccentRE=Replace(NoAccentRE,"á","§")
    NoAccentRE=Replace(NoAccentRE,"§","[aá]")
    NoAccentRE=Replace(NoAccentRE,"e","§")
    NoAccentRE=Replace(NoAccentRE,"é","§")
    NoAccentRE=Replace(NoAccentRE,"§","[eé]")
    NoAccentRE=Replace(NoAccentRE,"i","§")
    NoAccentRE=Replace(NoAccentRE,"í","§")
    NoAccentRE=Replace(NoAccentRE,"§","[ií]")
    NoAccentRE=Replace(NoAccentRE,"o","§")
    NoAccentRE=Replace(NoAccentRE,"ó","§")
    NoAccentRE=Replace(NoAccentRE,"ö","§")
    NoAccentRE=Replace(NoAccentRE,"ő","§")
    NoAccentRE=Replace(NoAccentRE,"§","[oóöő]")
    NoAccentRE=Replace(NoAccentRE,"u","§")
    NoAccentRE=Replace(NoAccentRE,"ú","§")
    NoAccentRE=Replace(NoAccentRE,"ü","§")
    NoAccentRE=Replace(NoAccentRE,"ű","§")
    NoAccentRE=Replace(NoAccentRE,"§","[uúüű]")
end function
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top