Install-Package SoftCircuits.FullTextSearchQuery
FullTextSearchQuery ist eine .NET-Klassenbibliothek, die einen benutzerfreundlichen Suchbegriff in eine gültige Microsoft SQL Server-Full-Text-Search-Abfrage umwandelt. Der Code versucht, alle Fälle zu erkennen und zu verarbeiten, in denen die Abfrage ansonsten einen Fehler generiert.
Microsoft SQL Server bietet eine leistungsstarke Suchfunktion mit Volltext. Die Syntax ist jedoch eher kryptisch, insbesondere bei Nichtprogrammern. Darüber hinaus gibt es viele Bedingungen, die dazu führen können, dass SQL Server einen Fehler aufwirft, wenn die Dinge nicht richtig sind.
FullTextSearchQuery konvertiert einen benutzerfreundlichen, Google-ähnlichen Suchbegriff in die entsprechende SQL-Abfragebedingung mit Volltext-Such. Sein Ziel ist es, niemals Ausnahmen von schlecht geformten Eingaben zu werfen. Es erstellt einfach die beste gültige Abfrage aus der Eingabe.
Die folgende Liste zeigt, wie verschiedene Eingaben transformiert werden.
| Eingang | Ausgabe | Beschreibung |
|---|---|---|
| ABC | FORMSOF(INFLECTIONAL, abc) | Finden Sie Flexionsformen von ABC. |
| ~ ABC | FORMSOF(THESAURUS, abc) | Finden Sie Thesaurus -Variationen von ABC. |
| "ABC" | "abc" | Finden Sie den genauen Begriff ABC. |
| +ABC | "abc" | Finden Sie den genauen Begriff ABC. |
| "ABC" in der Nähe "def" | "abc" NEAR "def" | Finden Sie den genauen Begriff ABC nahezu exakten Term Def. |
| ABC* | "abc*" | Findet Wörter, die mit ABC beginnen. |
| -Abc def | FORMSOF(INFLECTIONAL, def) AND NOT FORMSOF(INFLECTIONAL, abc) | Finden Sie wonbektrische Formen von DEF, aber nicht witzende Formen von ABC. |
| ABC def | FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) | Finden Sie wonbektrische Formen sowohl von ABC als auch von Def. |
| ABC oder def | FORMSOF(INFLECTIONAL, abc) OR FORMSOF(INFLECTIONAL, def) | Finden Sie wonbektrische Formen entweder ABC oder Def. |
| < +ABC +Def> | "abc" NEAR "def" | Finden Sie den genauen Begriff ABC nahezu exakten Term Def. |
| ABC und (def oder ghi) | FORMSOF(INFLECTIONAL, abc) AND (FORMSOF(INFLECTIONAL, def) OR FORMSOF(INFLECTIONAL, ghi)) | Finden Sie wonbektrische Formen sowohl von ABC als auch von Def oder GHI. |
Auch nach einer syntaktisch korrekten Abfrage kann SQL Server für einige Abfragen einen Fehler generieren. In der obigen Tabelle können Sie beispielsweise sehen, dass der Ousput für -abc def die beiden Suberxpressionen wechselt. Dies liegt daran NOT FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) einen Fehler verursachen. SQL Server mag das NOT am Start. In diesem Beispiel wechselt FullTextSearchQuery die beiden Suberxpressionen (auf beiden Seiten von AND ).
Nach dem Bau einer Abfrage prüft FullTextSearchQuery dies und einige andere Fehlerbedingungen und führt nach Bedarf Korrekturen vor. Die folgende Tabelle beschreibt diese Bedingungen.
| Begriff | Maßnahmen ergriffen |
|---|---|
| Nicht term1 und term2 | Unterexpressionen ausgetauscht. |
| Nicht Termin1 | Ausdruck verworfen. |
| Nicht ter1 und nicht term2 | Ausdruck verworfen, wenn der Knoten gruppiert ist (Klammern) oder der Wurzelknoten ist; Andernfalls kann der übergeordnete Knoten eine weitere Unterexpression enthalten, die diesen gültig macht. |
| Termin1 oder nicht Termin2 | Ausdruck verworfen. |
| Term1 in der Nähe nicht Term2 | Nahe Konjunktion wurde zu und. |
FullTextSearchQuery wandelt alle nahezu Konjunktionen in und wenn eine der beiden Subtonpressionen kein Internal mit den Formsabläufen ist. Literal.
Verwenden Sie die Methode Transform() , um einen Suchausdruck in eine gültige SQL Server-Volltext-Suchbedingung umzuwandeln. Diese Methode übernimmt eine benutzerfreundliche Suchabfrage und konvertiert sie in eine korrekt gebildete Volltext-Suchbedingung, die an SQL Servers CONTAINS oder CONTAINSTABLE Funktionen enthält. Wenn die Abfrage ungültige Begriffe enthält, tut der Code das, was er kann, um eine gültige Suchbedingung zurückzugeben. Wenn keine gültigen Begriffe gefunden wurden, gibt diese Methode eine leere Zeichenfolge zurück.
// Pass true to add the standard stop words
FtsQuery ftsQuery = new FtsQuery ( true ) ;
string searchTerm = ftsQuery . Transform ( text ) ; Im folgenden Beispiel für SQL -Abfrage ist @SearchTerm ein Verweis auf die von Transform() zurückgegebene Zeichenfolge.
SELECT select_list
FROM table AS FT_TBL INNER JOIN
CONTAINSTABLE(table, column, @SearchTerm) AS KEY_TBL
ON FT_TBL . unique_key_column = KEY_TBL.[KEY];Eine Sache, die Sie bewusst sind, ist die Handhabung von STOP -Wörtern durch SQL Server. Stoppwörter sind Wörter wie a und und das . Diese Wörter sind nicht im Volltextindex enthalten. SQL Server indiziert diese Wörter nicht, da sie sehr häufig sind und die Qualität der Suche nicht hinzufügen. Da diese Wörter nicht indiziert sind, wird SQL Server niemals eine Übereinstimmung mit diesen Wörtern finden. Das Ergebnis ist, dass eine Suche nach einem Stoppwort keine Ergebnisse zurückgibt, obwohl dieses Stoppwort in einem Artikel erscheinen kann!
Der beste Weg, dies zu bewältigen, scheint darin zu sein, diese Wörter aus der SQL -Abfrage auszuschließen. Mit einer einfachen Volltext -Suche können Sie dies tun, indem Sie die StopWords -Sammlungseigenschaft Stoppwörter hinzufügen. Stoppwörter werden nicht in die resultierende Abfrage einbezogen, es sei denn, sie werden angegeben, wodurch das Verhindern von Stoppwörtern in der Abfrage alle Ergebnisse blockiert.
Der einfachste Weg, um der StopWords -Sammlung eine Standardliste von Stoppwörtern hinzuzufügen, besteht darin, an den FtsQuery -Konstruktor zu true . (Um zu sehen, welche Wörter hinzugefügt wurden, können Sie einfach die StopWords -Sammlung inspizieren.) Sie können die StopWords -Sammlung nach Bedarf jederzeit ändern.
Alternativ bietet SQL Server eine Option, um das oben beschriebene Problem zu verhindern. Mit der Option "Transformation Noise Words" kann SQL Server aktiviert werden, auch wenn die Abfrage ein Stoppwort (Noise Word) enthält. Legen Sie diese Option auf 1 ein, um die Rauschwort -Transformation zu aktivieren. Weitere Informationen finden Sie unter Transformation Noise Words Server -Konfigurationsoption.
Die folgende Abfrage kann verwendet werden, um die Systemstoppwörter aus einer SQL Server -Datenbank zu erhalten.
SELECT ssw . stopword , slg . name
FROM sys . fulltext_system_stopwords ssw
JOIN sys . fulltext_languages slg
ON slg . lcid = ssw . language_id
WHERE slg . lcid = 1033Weitere Informationen und eine Diskussion des Codes finden Sie in meinem Artikel Easy Volltext-Suchabfragen.