4 Stimmen

Geräuschwörter in der Sql Server 2005 Volltextsuche

Ich versuche, eine Volltextsuche über eine Reihe von Namen in meiner Datenbank durchzuführen. Dies ist mein erster Versuch, eine Volltextsuche durchzuführen. Derzeit nehme ich den eingegebenen Suchstring und setze eine NEAR-Bedingung zwischen jeden Begriff (d.h. aus dem eingegebenen Ausdruck "Kings of Leon" wird "Kings NEAR of NEAR Leon").

Leider habe ich festgestellt, dass diese Taktik zu einem falsch-negativen Suchergebnis führt, weil das Wort "of" von SQL Server bei der Erstellung der Indizes ausgelassen wird, weil es ein Störwort ist. Daher wird "Kings Leon" korrekt übereinstimmen, aber "Kings of Leon" nicht.

Mein Kollege schlägt vor, alle Rauschwörter zu nehmen, wie sie in der MSSQL \FTData\noiseENG.txt und sie in den .Net-Code einzufügen, so dass die Störwörter entfernt werden können, bevor die Volltextsuche ausgeführt wird.

Ist dies die beste Lösung? Gibt es nicht eine automatische Einstellung, die ich im SQL-Server ändern kann, um dies für mich zu tun? Oder gibt es vielleicht einfach eine bessere Lösung, die nicht so umständlich ist?

4voto

Jonathan Kehayias Punkte 3382

Der Volltext wird auf der Grundlage der von Ihnen eingegebenen Suchkriterien bearbeitet. Sie können das Rauschwort aus der Datei entfernen, riskieren damit aber eine Aufblähung des Indexes. Robert Cain hat in seinem Blog eine Menge guter Informationen zu diesem Thema:

http://arcanecode.com/2008/05/29/creating-and-customizing-noise-words-in-sql-server-2005-full-text-search/

Um etwas Zeit zu sparen, können Sie sich ansehen, wie diese Methode sie entfernt, und den Code und die Wörter kopieren:

        public string PrepSearchString(string sOriginalQuery)
    {
        string strNoiseWords = @" 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | $ | ! | @ | # | $ | % | ^ | & | * | ( | ) | - | _ | + | = | [ | ] | { | } | about | after | all | also | an | and | another | any | are | as | at | be | because | been | before | being | between | both | but | by | came | can | come | could | did | do | does | each | else | for | from | get | got | has | had | he | have | her | here | him | himself | his | how | if | in | into | is | it | its | just | like | make | many | me | might | more | most | much | must | my | never | now | of | on | only | or | other | our | out | over | re | said | same | see | should | since | so | some | still | such | take | than | that | the | their | them | then | there | these | they | this | those | through | to | too | under | up | use | very | want | was | way | we | well | were | what | when | where | which | while | who | will | with | would | you | your | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z ";

        string[] arrNoiseWord = strNoiseWords.Split("|".ToCharArray());

        foreach (string noiseword in arrNoiseWord)
        {
            sOriginalQuery = sOriginalQuery.Replace(noiseword, " ");
        }
        sOriginalQuery = sOriginalQuery.Replace("  ", " ");
        return sOriginalQuery.Trim();
    }

jedoch würde ich wahrscheinlich mit einem Regex.Replace für diese gehen, die viel schneller als Schleife sein sollte. Ich habe nur nicht ein schnelles Beispiel zu posten.

0voto

Herb Caudill Punkte 49603

Hier ist eine funktionierende Funktion. Die Datei noiseENU.txt wird so wie es ist kopiert von \Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\FTData .

    Public Function StripNoiseWords(ByVal s As String) As String
        Dim NoiseWords As String = ReadFile("/Standard/Core/Config/noiseENU.txt").Trim
        Dim NoiseWordsRegex As String = Regex.Replace(NoiseWords, "\s+", "|") ' about|after|all|also etc.
        NoiseWordsRegex = String.Format("\s?\b(?:{0})\b\s?", NoiseWordsRegex)
        Dim Result As String = Regex.Replace(s, NoiseWordsRegex, " ", RegexOptions.IgnoreCase) ' replace each noise word with a space
        Result = Regex.Replace(Result, "\s+", " ") ' eliminate any multiple spaces
        Return Result
    End Function

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X