So ermöglichen Sie die Volltextsuche mit Bindestrichen in der Suchanfrage

9

Ich habe Schlüsselwörter wie "some-and-other", bei denen die Bindestriche bei der Suche durch meine mysql-Datenbank eine Rolle spielen. Ich verwende derzeit die Volltextfunktion.

Gibt es eine Möglichkeit, dem Bindestrich-Charakter zu entkommen? Ich weiß, dass es eine Option ist, #define HYPHEN_IS_DELIM in der Datei myisam / ftdefs.h zu kommentieren, aber mein Host erlaubt dies leider nicht. Gibt es eine andere Möglichkeit da draußen?

Bearbeiten 3-8-11 Hier ist der Code, den ich gerade habe:

%Vor%     
Jay 04.03.2011, 10:25
quelle

4 Antworten

13

Von hier Ссылка

Eine Lösung, um ein Wort mit Bindestrichen oder Bindestrichen zu finden, ist die Verwendung von FULL TEXT SEARCH IM BOOLEAN MODE und das Wort mit dem Bindestrich / Bindestrich in doppelte Anführungszeichen zu setzen.

Oder von hier Ссылка

Es gibt eine weitere Problemumgehung. Es wurde vor kurzem dem Handbuch hinzugefügt: " Ändern einer Zeichensatzdatei: Dies erfordert keine Neukompilierung. Das Makro true_word_char () verwendet eine "Zeichentyp" -Tabelle, um Buchstaben und Zahlen von anderen zu unterscheiden Figuren. . Sie können den Inhalt in einem der Zeichensatz-XML bearbeiten Dateien, die angeben, dass "-" ein "Buchstabe" ist. Verwenden Sie dann den gegebenen Zeichensatz für Ihre FULLTEXT Indizes. "

Habe es nicht selbst versucht.

Bearbeiten: Hier finden Sie weitere Informationen von hier Ссылка

Eine in doppelte Anführungszeichen ("" ") eingeschlossene Phrase entspricht nur Zeilen, die die Phrase wörtlich enthalten, wie sie eingegeben wurde. Die Volltext-Engine teilt die Phrase in Wörter auf und führt eine Suche im FULLTEXT-Index nach Die Wörter Vor MySQL 5.0.3 führte die Engine dann eine Teilzeichensuche nach der Phrase in den gefundenen Datensätzen durch, so dass die Übereinstimmung Nicht-Wortzeichen in der Wortgruppe enthalten muss.Am MySQL 5.0.3 müssen Nichtwortzeichen nicht sein genau übereinstimmend: Die Phrasensuche erfordert nur, dass Übereinstimmungen genau die gleichen Wörter wie die Phrase und in der gleichen Reihenfolge enthalten, zB "Testphrase" stimmt mit "Test, Phrase" in MySQL 5.0.3 überein, aber vorher nicht.

Wenn die Phrase keine Wörter enthält, die im Index enthalten sind, ist das Ergebnis leer. Wenn beispielsweise alle Wörter entweder Stoppwörter oder kürzer als die Mindestlänge indizierter Wörter sind, ist das Ergebnis leer.

    
Yasen Zhelev 04.03.2011 10:54
quelle
3

Vielleicht einfacher, den Operator Binary zu verwenden.

%Vor%

Ссылка

Der Operator BINARY wandelt die nachfolgende Zeichenfolge in eine Binärzeichenfolge um. Dies ist eine einfache Möglichkeit, einen Spaltenvergleich Byte für Byte statt Zeichen für Zeichen zu erzwingen. Dies führt dazu, dass der Vergleich die Groß- / Kleinschreibung berücksichtigt, auch wenn die Spalte nicht als BINARY oder BLOB definiert ist. BINARY bewirkt auch, dass nachfolgende Leerzeichen signifikant sind.

    
Hutcho 29.01.2012 04:32
quelle
2

Einige Leute würden vorschlagen, die folgende Abfrage zu verwenden:

%Vor%

Aber Sie brauchen viele Varianten, abhängig von den verwendeten Volltextoperatoren. Aufgabe: Realisieren Sie eine Abfrage wie +well-known +(>35-hour <39-hour) working week* . Zu komplex!

Und vergessen Sie nicht die Standardlänge von ft_min_word_len , damit eine Suche nach up-to-date nur date in Ihren Ergebnissen zurückgibt.

Trick

Deswegen bevorzuge ich einen Trick, also werden Konstruktionen mit HAVING etc überhaupt nicht benötigt:

  1. Anstatt den folgenden Text zu Ihrer Datenbanktabelle hinzuzufügen:

    SELECT id 
    FROM texts
    WHERE MATCH(text) AGAINST('well-known' IN BOOLEAN MODE)
    HAVING text LIKE '%well-known%';
    
    kopiert die Bindestrichwörter ohne Hyphen an das Ende des Textes in einem Kommentar:
    "The Up-to-Date Sorcerer" is a well-known science fiction short story.
  2. Wenn die Benutzer nach up-to-date suchen, entfernen Sie den Bindestrich in der SQL-Abfrage:
    MATCH(text) AGAINST('uptodate ' IN BOOLEAN MODE)

Damit kannst du up-to-date als ein Wort finden, anstatt alle Ergebnisse zu erhalten, die nur date enthalten (weil ft_min_word_len kills up und to ).

Natürlich bevor Sie echo der Texte entfernen, sollten Sie die <!-- ... --> Kommentare entfernen.

Vorteile

  • die Abfrage ist einfacher
  • Der Benutzer kann wie gewohnt alle Volltextoperatoren verwenden
  • Die Abfrage ist schneller.
  • Wenn ein Benutzer nach -well-known +science sucht, behandelt MySQL dies als not include *well*, could include *known* and must include *science* . Dies ist nicht, was der Benutzer erwartet hat. Der Trick löst das auch (da die SQL-Abfrage nach -wellknown +science sucht)
mgutt 29.01.2017 20:53
quelle
0

Das hört sich vielleicht an, aber nachdem ich eine Weile damit zu kämpfen hatte, merkte ich, dass ich die gewünschten Ergebnisse erziele, indem ich den Bindestrich aus dem Suchausdruck lösche. Zum Beispiel, wenn ich nach 'wortgetrennt' suche

%Vor%

gibt bei Bedarf Instanzen von "wortgetrennt" zurück. Dies gibt auch andere Instanzen von separated und word zurück, aber das Hinzufügen des + Operators zu jedem Wort führt zur Bindestrichsuche.

%Vor%     
Félix Gagnon-Grenier 08.03.2018 17:17
quelle