Wie erhalten Sie führende Wildcard-Volltextsuchen in SQL Server?

  • Hinweis: Ich bin benutze die Volltextsuchfunktionen von SQL, die CONTAINS-Klauseln und alle - das * ist der Platzhalter im Volltext. % gilt nur für LIKE-Klauseln.

    Ich habe jetzt an mehreren Stellen gelesen, dass die Suche nach führenden Platzhaltern (z. B. die Verwendung von "* overflow" für "stackoverflow") nicht unterstützt wird in MS SQL. Ich überlege, eine CLR-Funktion zu verwenden Regex-Abgleich hinzufügen , aber ich bin neugierig, welche Lösungen andere Menschen möglicherweise haben.

    Weitere Informationen : Sie können das Sternchen nur am Ende des Wortes oder der Phrase hinzufügen. - zusammen mit meiner empirischen Erfahrung: Wenn "myvalue" übereinstimmt, funktioniert "my *", aber "(Sternchen)" gibt keine Übereinstimmung zurück, wenn eine Abfrage so einfach ausgeführt wird:

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

    Daher ist meine Notwendigkeit für einen Workaround. Ich verwende die Suche auf meiner Website nur auf einer tatsächlichen Suchseite. Daher muss sie im Wesentlichen auf dieselbe Weise funktionieren, wie Google (in den Augen eines Joe Sixpack-Benutzers). Nicht annähernd so kompliziert, aber diese Art von Übereinstimmung sollte wirklich nicht fehlschlagen.

    17 July 2009
    John Saunders
14 answers
  • Umgehung nur für führende Platzhalterzeichen:

    • Speichern Sie den Text in einem anderen Feld (oder in der materialisierten Ansicht)
    • Erzeuge einen Volltextindex für diese Spalte
    • Finde den umgekehrten Text mit einem *

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

    Natürlich gibt es viele Nachteile, nur für eine schnelle Problemumgehung ...

    Ganz zu schweigen von CONTAINSTABLE ...

    18 March 2016
    marc_suser1374841
  • Das Problem mit führenden Platzhaltern: Sie können nicht indiziert werden, daher führen Sie einen vollständigen Tabellenscan durch.

    06 August 2008
    Michael Stum
  • Eine Sache, die es zu beachten gilt, ist die Tatsache, dass führende Wildcard-Abfragen im Vergleich zu anderen Wildcard-Verwendungen eine erhebliche Leistungsprämie bedeuten

    06 August 2008
    Dave Ward
  • Es ist möglich, den Platzhalter "*" am Ende des Wortes oder der Phrase zu verwenden (Präfixsuche).

    Diese Abfrage findet beispielsweise alle "datab", "datenbank", "datenbanken" ...

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

    Aber leider ist dies nicht der Fall Es ist möglich, mit führenden Platzhaltern zu suchen.

    Diese Abfrage findet beispielsweise nicht die Datenbank "

     SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"*abase"')
     
    26 November 2008
  • Um diesem Thread vielleicht Klarheit zu verleihen, ist Franjo aus meinem Test von 2008 R2 richtig. Bei der Volltextsuche können Sie, zumindest bei Verwendung der CONTAINS-Klausel, kein führendes verwenden, sondern nur ein nachfolgendes . * ist der Platzhalter, nicht% im Volltext.

    Einige haben vorgeschlagen, dass * ignoriert wird. Das scheint nicht der Fall zu sein, meine Ergebnisse scheinen zu zeigen, dass die nachgestellte * Funktionalität funktioniert. Ich denke, führende * werden von der Engine ignoriert.

    Mein hinzugefügtes Problem ist jedoch, dass dieselbe Abfrage mit einem abschließenden *, das Volltext mit Platzhaltern verwendet, relativ schnell auf 2005 funktionierte ( 20 Sekunden) und verlangsamt sich auf 12 Minuten nach der Migration der Datenbank auf 2008 R2. Es scheint, dass mindestens ein anderer Benutzer ähnliche Ergebnisse erzielt hat und er hat einen Forenbeitrag gestartet, den ich hinzugefügt habe ... FREETEXT funktioniert immer noch schnell, aber etwas "scheint" sich mit der Art geändert zu haben, in der 2008 * in CONTAINS abläuft. Sie geben im Upgrade Advisor alle möglichen Warnungen aus, dass sie FULL TEXT "verbessert" haben, so dass Ihr Code möglicherweise beschädigt wird. Sie erhalten jedoch leider keine spezifischen Warnungen über bestimmten veralteten Code usw. ... nur ein Haftungsausschluss, den sie geändert haben. Benutzung auf eigene Gefahr.

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

    <|.

    Möglicherweise ist dies der nächste MS-Treffer, der mit diesen Problemen in Verbindung steht ... http://msdn.microsoft.com/en-us/library/ms143709.aspx

    06 October 2011
    Forrest
  • Das Platzhalterzeichen in SQL Server ist das % -Zeichen und funktioniert einwandfrei, führend, nachlaufend oder auf andere Weise.

    Das heißt, wenn Sie es sind Ich würde jede ernsthafte Volltextsuche durchführen, dann würde ich die Volltextindex-Funktionen in Betracht ziehen. Die Verwendung von Platzhaltern % und _ führt dazu, dass Ihre Datenbank einen erheblichen Performance-Treffer erleidet.

    18 March 2016
    KevBrian
  • Als Parameter in einer gespeicherten Prozedur können Sie es wie folgt verwenden:

     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)
     
    18 March 2016
    marc_suser1374841
  • Nur zu Ihrer Information, Google führt keine Suche nach Zeichenketten und keine Kürzung durch (rechts oder links). Sie haben ein Platzhalterzeichen *, um unbekannte Wörter in einer Phrase zu finden, nicht jedoch ein Wort.

    Google erstellt zusammen mit den meisten Volltextsuchmaschinen einen invertierten Index, der auf der alphabetischen Reihenfolge der Wörter basiert und Links zu deren Quelldokumenten enthält. Die binäre Suche ist auch bei großen Indexen schnell erledigt. In diesem Fall ist es jedoch wirklich sehr schwierig, eine linke Verkürzung vorzunehmen, da dadurch der Vorteil des Indexes verloren geht.

    16 September 2008
    user9569
  • Aus der SQL Server-Onlinedokumentation:

    Um Volltextabfragen in Microsoft SQL Server 2005 zu schreiben, müssen Sie lernen, wie man die CONTAINS- und FREETEXT-Transact-SQL-Vergleichselemente verwendet, und die CONTAINSTABLE- und FREETEXTTABLE - Rowsetwertfunktionen.

    Das bedeutet, dass alle Abfragen, die oben mit% und _ geschrieben wurden, keine gültigen Volltextabfragen sind.

    Hier sehen Sie ein Beispiel, wie eine Abfrage aussieht, wenn CONTAINSTABLE aufgerufen wird function.

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

    Damit die CONTAINSTABLE-Funktion weiß, dass ich bin Mit einer Wildcard-Suche muss ich sie in Anführungszeichen setzen. Ich kann das Platzhalterzeichen * am Anfang oder am Ende verwenden. Es gibt viele andere Möglichkeiten, wenn Sie den Suchstring für die CONTAINSTABLE-Funktion erstellen. Sie können nach einem Wort in der Nähe eines anderen Wortes suchen, nach Wendewörtern suchen (Laufwerk = Laufwerk, Laufwerk, Fahren und Fahren) und nach einem Synonym für ein anderes Wort suchen (Metall kann Synonyme wie Aluminium und Stahl haben).

    Ich habe gerade eine Tabelle erstellt, einen vollständigen Textindex für die Tabelle erstellt und einige Testsuchvorgänge durchgeführt und hatte kein Problem. Die Suche mit Platzhaltern funktioniert also wie beabsichtigt.

    [Update]

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

    Sie können noch mit dem Platzhalter am Anfang suchen, aber wenn das Wort nach dem Platzhalter kein ganzes Wort ist, müssen Sie am Ende einen weiteren Platzhalter hinzufügen.

     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 - Verwenden eines Platzhalters mit einer der Funktionen sollte kein großer Perfomance-Hit sein. Wenn ich eine Suchzeichenfolge mit "*" erstellt habe, werden nicht alle Zeilen zurückgegeben. In meinem Test ca

    06 August 2008
    Otto
  • Wenn Sie Zugriff auf die Liste der Wörter der Volltextsuchmaschine haben, können Sie in dieser Liste eine Like-Suche durchführen und die Datenbank mit den gefundenen Wörtern abgleichen, z. eine Tabelle 'Wörter' mit folgenden Wörtern:

         pie
        applepie
        spies
        cherrypie
        dog
        cat
     

    Um alle Wörter zu finden, die 'pie' in dieser Datenbank enthalten eine 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
     
    02 July 2018
    Hans