How do you get leading wildcard full- Textsuche für SQL Server?

Translate

Hinweis:ichamVerwenden Sie die Volltextsuchfunktionen von SQL, CONTAINS-Klauseln und alles - 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" entsprechend "stackoverflow") in MS SQL nicht unterstützt wird. Ich denke darüber nach, einCLR-Funktion zum Hinzufügen von Regex-Matching, aber ich bin gespannt, welche anderen Lösungen die Leute haben könnten.

Mehr Info: 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) value" gibt keine Übereinstimmung zurück, wenn eine Abfrage so einfach wie:

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

Daher meine Notwendigkeit für eine Problemumgehung. Ich verwende die Suche auf meiner Website nur auf einer tatsächlichen Suchseite. Daher muss sie im Wesentlichen genauso funktionieren wie Google (in den Augen eines Nutzers vom Typ Joe Sixpack). Nicht annähernd so kompliziert, aber diese Art von Match sollte wirklich nicht scheitern.

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Problemumgehung nur für führende Platzhalter:

  • Speichern Sie den umgekehrten Text in einem anderen Feld (oder in einer materialisierten Ansicht).
  • Erstellen Sie einen Volltextindex für diese Spalte
  • Suchen Sie 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 ...

Quelle
Translate

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

Quelle
Chad Lee
Translate

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

Diese Abfrage findet beispielsweise alle "Datenbanken", "Datenbanken", "Datenbanken" ...

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

Leider ist es nicht möglich, mit einem führenden Platzhalter zu suchen.

Beispielsweise findet diese Abfrage keine "Datenbank".

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

Um diesem Thread vielleicht Klarheit zu verleihen, ist Franjo aus meinen Tests mit 2008 R2 oben richtig. Bei der Volltextsuche können Sie zumindest bei Verwendung der CONTAINS-Phrase keine führende verwenden, nur ein nachlaufenderfunktional. * 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 Trailing * -Funktionalität funktioniert. Ich denke, führend * werden vom Motor ignoriert.

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

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

Vielleicht ist dies der nächste MS-Treffer im Zusammenhang mit diesen Problemen ...http://msdn.microsoft.com/en-us/library/ms143709.aspx

Quelle
Translate

Beachten Sie, dass führende Platzhalterabfragen im Vergleich zu anderen Platzhalterverwendungen einen erheblichen Leistungsaufschlag haben.

Quelle
Kev
Translate

Das Platzhalterzeichen in SQL Server ist das%Zeichen und es funktioniert gut, führend, nachlaufend oder auf andere Weise.

Das heißt, wenn Sie eine ernsthafte Volltextsuche durchführen möchten, würde ich die Verwendung der Funktionen für den Volltextindex in Betracht ziehen. Verwenden von%und_Platzhalter führen dazu, dass Ihre Datenbank einen ernsthaften Leistungseinbruch erleidet.

Quelle
Translate

Aus den SQL Server-Online-Büchern:

Um Volltextabfragen in Microsoft SQL Server 2005 zu schreiben, müssen Sie lernen, wie Sie die Transact-SQL-Prädikate CONTAINS und FREETEXT sowie die Rowset-Werte CONTAINSTABLE und FREETEXTTABLE verwenden.

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

Hier ist ein Beispiel dafür, wie eine Abfrage beim Aufrufen der Funktion CONTAINSTABLE aussieht.

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

Damit die CONTAINSTABLE-Funktion weiß, dass ich eine Platzhaltersuche verwende, muss ich sie in doppelte Anführungszeichen setzen. Ich kann das Platzhalterzeichen * am Anfang oder Ende verwenden. Es gibt viele andere Dinge, die Sie tun können, wenn Sie die Suchzeichenfolge für die Funktion CONTAINSTABLE erstellen. Sie können nach einem Wort in der Nähe eines anderen Wortes suchen, nach Flexionswörtern suchen (Laufwerk = Laufwerke, gefahren, fahren und gefahren) 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 Volltextindex in die Tabelle eingefügt und einige Testsuchen durchgeführt. Ich hatte kein Problem, sodass die Platzhaltersuche wie beabsichtigt funktioniert.

[Aktualisieren]

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

Sie können weiterhin mit dem Platzhalter am Anfang suchen. Wenn das Wort jedoch kein vollständiges Wort nach dem Platzhalter 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 Nr. 2]

Dave Ward - Die Verwendung eines Platzhalters mit einer der Funktionen sollte kein großer Erfolg sein. Wenn ich eine Suchzeichenfolge mit nur "*" erstellt habe, werden nicht alle Zeilen zurückgegeben. In meinem Testfall wurden 0 Datensätze zurückgegeben.

Quelle
Translate

Nur zu Ihrer Information, Google führt keine Teilstring-Suchen oder Kürzungen durch, weder rechts noch links. Sie haben ein Platzhalterzeichen *, um unbekannte Wörter in einer Phrase zu finden, aber kein Wort.

Google erstellt zusammen mit den meisten Volltextsuchmaschinen einen invertierten Index basierend auf der alphabetischen Reihenfolge der Wörter mit Links zu den Quelldokumenten. Die binäre Suche ist selbst für große Indizes sehr schnell. In diesem Fall ist es jedoch sehr schwierig, eine Linksabschneidung vorzunehmen, da dadurch der Vorteil des Index verloren geht.

Quelle
Translate

Als Parameter in einer gespeicherten Prozedur können Sie ihn verwenden 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)
Quelle
Translate

Wenn es um die Volltextsuche geht, gibt es für mein Geld nichts SchöneresLucene. Da ist ein.Net-Port verfügbarDas ist kompatibel mit Indizes, die mit der Java-Version erstellt wurden.

Es ist ein wenig Arbeit damit verbunden, dass Sie die Indizes erstellen / pflegen müssen, aber die Suchgeschwindigkeit ist fantastisch und Sie können alle möglichen interessanten Abfragen erstellen. Selbst die Indizierungsgeschwindigkeit ist ziemlich gut - wir erstellen unsere Indizes nur einmal am Tag komplett neu und sorgen uns nicht um deren Aktualisierung.

Als Beispiel,diese Suchfunktionwird von Lucene.Net betrieben.

Quelle
Translate

Vielleicht liefert der folgende Link die endgültige Antwort auf diese Verwendung von Platzhaltern:Durchführen von FTS-Platzhaltersuchen.

Beachten Sie die Passage, in der es heißt: "Wenn Sie jedoch angeben"Kette “oder„ Kapain ”erhalten Sie nicht das erwartete Ergebnis. Das Sternchen wird als normales Interpunktionszeichen und nicht als Platzhalterzeichen betrachtet. ""

Quelle
Translate

Wenn Sie Zugriff auf die Liste der Wörter der Volltextsuchmaschine haben, können Sie eine "Gefällt mir" -Suche in dieser Liste durchführen und die Datenbank mit den gefundenen Wörtern abgleichen, z. B. eine Tabelle "Wörter" mit folgenden Wörtern:

    pie
    applepie
    spies
    cherrypie
    dog
    cat

So ordnen Sie alle Wörter, die 'pie' in dieser Datenbank enthalten, in einer fts-Tabelle 'full_text' dem Feld 'text' zu:

    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
Quelle
Translate

% Entspricht einer beliebigen Anzahl von Zeichen _ Entspricht einem einzelnen Zeichen

Ich habe noch nie die Volltextindizierung verwendet, aber Sie können ziemlich komplexe und schnelle Suchabfragen durchführen, indem Sie einfach die integrierten T-SQL-Zeichenfolgenfunktionen verwenden.

Quelle