Frage

Hinweis: Ich bin mithilfe von SQL Full-text search capabilities, ENTHÄLT Klauseln und alle - das * ist das Platzhalterzeichen, die in full-text") % für WIE-Klauseln nur.

Ich habe gelesen in einigen Orten nun, dass "führende wildcard" - Recherchen (z.B.mit "*überlauf" zu entsprechen, "stackoverflow") ist nicht unterstützt in MS SQL.Ich überlege mir, mit einem CLR-Funktion zum hinzufügen von regex-matching, aber ich bin neugierig zu sehen, was andere Lösungen, die Menschen haben könnten.

Mehr Info: Sie können die Sternchen, die nur am Ende des Wortes oder phrase. - zusammen mit meiner empirischen Erfahrung:Wenn Sie matching "myvalue", "mein*" funktioniert, aber "(Sternchen)Wert" gibt es keine übereinstimmung, wenn Sie eine Abfrage so einfach wie:

SELECT * FROM TABLENAME WHERE CONTAINS(TextColumn, '"*searchterm"');

So, mein Bedürfnis für eine Problemumgehung.Ich bin nur über die Suchfunktion in "meine Website" auf eine tatsächliche Suche Seite - so muss es grundsätzlich die gleichen, wie Google funktioniert (in den Augen auf Joe Sixpack-Typ Benutzer).Nicht annähernd so kompliziert, aber diese Art von Spiel sollte wirklich nicht scheitern.

Keine korrekte Lösung

Andere Tipps

Problemumgehung nur für führende wildcard":

  • speichern Sie den text Umgekehrt in ein anderes Feld (oder in materialisierte Ansicht)
  • erstellen Sie einen full-text-index auf dieser Spalte
  • finden Sie den umgedrehten text mit einem *

    SELECT * 
    FROM TABLENAME 
    WHERE CONTAINS(TextColumnREV, '"mrethcraes*"');
    

Natürlich gibt es auch viele Nachteile, die nur für schnelle Abhilfe...

Nicht zu erwähnen, CONTAINSTABLE...

Das problem mit den führenden Platzhalter:Sie können nicht indiziert werden, damit machst du einen full table scan.

Es ist möglich, verwenden Sie die Platzhalter "*" am Ende des Wortes oder der phrase (Präfix-Suche).

Zum Beispiel diese Abfrage findet alle "Datenb", "Datenbank", "Datenbanken" ...

SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"datab*"')

Aber, unforutnately, es ist nicht möglich, um die Suche mit führenden Platzhalter.

Zum Beispiel diese Abfrage nicht finden "Datenbank"

SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"*abase"')

Vielleicht fügen Sie Klarheit in diesem thread von meinen Tests, die auf 2008 R2, Franjo korrekt ist oben.Beim Umgang mit Volltext-Suche, zumindest unter den Satz ENTHÄLT, können Sie nicht verwenden, einem führenden , nur ein trailing funktional.* ist das Platzhalterzeichen, nicht % im Volltext.

Einige haben vorgeschlagen, dass * wird ignoriert.Das scheint nicht der Fall zu sein, meine Ergebnisse zu zeigen scheinen, dass die Sternchen-Funktionalität funktioniert.Ich denke führenden * ignoriert die engine.

Mein zusätzliches problem ist jedoch, dass die gleiche Abfrage mit einem Sternchen, das benutzt full-text mit Platzhaltern gearbeitet relativ schnell auf 2005(20 Sekunden), und verlangsamt, um 12 Minuten nach der Migration der db auf 2008 R2.Es scheint, mindestens einen anderen Benutzer hatten ähnliche Ergebnisse und er fing an, ein forum posten, das ich Hinzugefügt, um...FREETEXT arbeitet schnell noch, aber etwas "scheint" zu haben, verändert die Art und Weise 2008-Prozesse trailing * in ENTHÄLT.Sie geben alle Arten von Warnungen in der Upgrade-Advisor, dass Sie "verbessert", FULL TEXT, so dass Ihr code beschädigt wird, aber leider Sie nicht geben Sie jede spezifische Warnhinweise über bestimmte deprecated code-etc....nur ein Haftungsausschluss, die Sie geändert haben es, auf eigenes Risiko zu verwenden.

http://social.msdn.microsoft.com/Forums/ar-SA/sqlsearch/thread/7e45b7e4-2061-4c89-af68-febd668f346c

Vielleicht ist es der nächste MS-hit in Bezug auf diese Fragen... http://msdn.microsoft.com/en-us/library/ms143709.aspx

Eine Sache, die es Wert im Auge zu behalten ist, dass führende wildcard-Abfragen kommen zu einem erheblichen performance-premium, im Vergleich zu anderen wildcard-usages.

Das wildcard-Zeichen in SQL Server ist die % Zeichen und es funktioniert gut, leading, trailing oder anderweitig.

Das heißt, wenn du gehst zu tun, jede Art von schweren full-text Suche, dann würde ich prüfen, unter Verwendung der Full-Text-Index-Funktionen.Verwendung % und _ wild cards wird Ihre Datenbank zu ernsthaften Leistungseinbußen.

Aus der SQL Server-Onlinedokumentation:

Zum schreiben von Volltextabfragen in Microsoft SQL Server 2005 verwenden, müssen Sie erfahren Sie, wie zu verwenden die enthalten sind, und FREETEXT Transact-SQL-Prädikaten, und die mit CONTAINSTABLE und FREETEXTTABLE rowset-valued-Funktionen.

Das bedeutet, dass alle Abfragen oben geschrieben mit dem % " und " _ " sind nicht gültig ist full-text queries.

Hier ist ein Beispiel, was eine Abfrage aussieht, wenn den Aufruf der CONTAINSTABLE-Funktion.

SELECT RANK , * FROM TableName , CONTAINSTABLE (TableName, *, ' "*WildCard -" ') searchTable WO [KEY] = TableName.ORDER BY pk searchTable.RANK DESC

Um für die CONTAINSTABLE-Funktion zu wissen, dass ich mit einem wildcard-Suche, muss ich wickeln Sie es in Anführungszeichen setzen.Ich kann die Platzhalterzeichen " * " an den Anfang oder das Ende.Es gibt eine Menge anderer Dinge, die Sie tun können, wenn Sie bauen die such-Zeichenfolge für den CONTAINSTABLE-Funktion.Sie können suchen, für ein Wort ein anderes Wort-Suche für flektierenden Wörter (drive = - Laufwerke, fuhr fahren, und angetrieben), und Suche nach synonym ein anderes Wort (Metall können Synonyme wie Aluminium und Stahl).

Ich habe gerade eine Tabelle erstellt, setzen Sie einen full-text-index auf den Tisch und machte ein paar test-Suche und habe nicht ein problem haben, so wildcard-Suche funktioniert wie vorgesehen.

[Update]

Ich sehe, dass Sie haben aktualisiert Ihre Frage und wissen, dass Sie müssen verwenden Sie eine der Funktionen.

Sie können immer noch die Suche mit wildcard am Anfang, aber wenn das Wort nicht ein Wort nach dem wildcard, Sie müssen hinzufügen eine weitere wildcard am Ende.

Example:  "*ildcar" will look for a single word as long as it ends with "ildcar".

Example:  "*ildcar*" will look for a single word with "ildcar" in the middle, which means it will match "wildcard".  [Just noticed that Markdown removed the wildcard characters from the beginning and ending of my quoted string here.]

[Update #2]

Dave Ward - Platzhalter mit einer der Funktionen sollte nicht eine große perf Treffer.Wenn ich eine such-string nur mit "*", wird es nicht alle Zeilen, in meinem Testfall, es zurückgegeben werden 0 Datensätze ein.

Just FYI, Google macht das nicht jeder Teilstring suchen oder abschneiden, rechts oder Links.Sie haben ein wildcard-Zeichen * zu finden, unbekannte Wörter in einem Satz, aber nicht ein Wort.

Google, zusammen mit den meisten full-text search engines, legt einen invertierten index auf Basis der alphabetischen Reihenfolge der Wörter, mit links zu den Quell-Dokumenten.Binäre Suche wird böse, schnell, sogar für große Indizes.Aber es ist wirklich schwer zu tun, einer linken-abschneiden in diesem Fall, denn es verliert den Vorteil des index.

Als parameter in einer gespeicherten Prozedur, die Sie können verwenden Sie es als:

ALTER procedure [dbo].[uspLkp_DrugProductSelectAllByName]
(
    @PROPRIETARY_NAME varchar(10)
)
as
    set nocount on
    declare @PROPRIETARY_NAME2 varchar(10) = '"' + @PROPRIETARY_NAME + '*"'

    select ldp.*, lkp.DRUG_PKG_ID
    from Lkp_DrugProduct ldp
    left outer join Lkp_DrugPackage lkp on ldp.DRUG_PROD_ID = lkp.DRUG_PROD_ID
    where contains(ldp.PROPRIETARY_NAME, @PROPRIETARY_NAME2)

Wenn es um full-text Suche, für mein Geld, nichts beats Lucene.Es ist ein .Net-port zur Verfügung , dass ist kompatibel mit Indizes erstellt, mit der Java-version.

Es gibt ein wenig Arbeit, die Sie haben, zu erstellen/pflegen die Indizes, aber die Suchgeschwindigkeit ist fantastisch und Sie können alle Arten von interessanten Abfragen.Auch die Indizierung Geschwindigkeit ist ziemlich gut - wir komplett unsere Indizes neu erstellen einmal am Tag und Mach dir keine sorgen über Sie zu aktualisieren.

Als ein Beispiel, diese Suchfunktionalität angetrieben durch Lucene.Net.

Vielleicht ist der folgende link bereitstellen, die endgültige Antwort zu dieser Verwendung von Platzhaltern: Durchführung von FTS Wildcard-Suche.

Hinweis: die passage, die besagt:"Doch, wenn Sie angeben, “Kette" oder "Chain", erhalten Sie nicht das erwartete Ergebnis.Der Stern wird als eine normale Satzzeichen nicht ein wildcard-Charakter."

Wenn Sie Zugang zu der Liste von Wörtern die Volltext-Suchmaschine, die Sie tun könnten, ein "gefällt mir" - Suche auf dieser Liste und der Datenbank überein mit dem Worte, z.B.eine Tabelle 'Wörter' mit folgenden Worten:

    pie
    applepie
    spies
    cherrypie
    dog
    cat

Um übereinstimmung aller Wörter mit 'pie' in diese Datenbank auf einem fts Tabelle 'full_text' mit Feld 'text':

    to-match <- SELECT word FROM words WHERE word LIKE '%pie%'
    matcher = ""
    a = ""
    foreach(m, to-match) {
      matcher += a
      matcher += m
      a = " OR "
    }
    SELECT text FROM full_text WHERE text MATCH matcher

% Steht für eine beliebige Anzahl von Zeichen _ Entspricht einem einzelnen Zeichen

Ich habe es nie benutzt Full-Text indexing, aber Sie erreichen können ziemlich Komplex und schnelle Suchanfragen mit der Sie einfach die build-in T-SQL string-Funktionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top