2012-10-01 7 views
9

Ich baue eine Suche nach einer Website, die eine Volltextsuche verwendet. Die Suche selbst funktioniert großartig, das ist nicht mein Problem. Ich zeichne die vom Benutzer bereitgestellten Schlüsselwörter (MATCH ... AGAINST ...) mit ANDs zusammen, so dass mehrere Wörter die Ergebnisse weiter einschränken. Jetzt weiß ich, dass bestimmte Stoppwörter nicht indiziert sind, und das ist für mich in Ordnung, ich möchte sie nicht wirklich als Auswahlkriterien verwenden. Wenn jedoch ein Stoppwort im Schlüsselwortsatz (vom Benutzer) bereitgestellt wird, werden alle Ergebnisse (wie erwartet) beendet, selbst wenn das Wort tatsächlich in einem bestimmten Textblock vorhanden ist.Ignorieren von MySQL Volltext Stoppwörter in Abfrage

Meine Frage: Gibt es eine Möglichkeit zu überprüfen, ob ein bestimmtes Wort zum Zeitpunkt der Abfrage ein Stoppwort ist? Meine bevorzugte Lösung wäre nur, das relevante Wort von den Suchkriterien auszuschließen (es ist mir egal, ob ein Benutzer Ergebnisse durch das Wort "weder" einschränken kann), ich möchte einfach nicht, dass MySQL eine leere Ergebnismenge als Benutzer zurückgibt vorausgesetzt, obwohl es in den Ergebnissen nicht existiert). Oder muss ich nur die Stoppwortliste leeren? Vielen Dank für jede Hilfe.

bearbeiten ---- Es tut mir leid, aber es gibt wirklich keine Code-Schnipsel für diese eine. Der Code funktioniert gut, eigentlich genau wie erwartet. Es ist eher ein logisches Problem, mit dem ich es zu tun habe. Aber als Beispiel in der Art und Weise der Erklärung:

kann sagen, es gibt drei Datensätze, welche die Worte umfassen (sind aber nicht beschränkt auf)

1: Apfel, Orange, Mango, Banane 2: Traube , Orange, Ananas, Mango 3: Kartoffel, Mango, Melone, Keira ritterlich

Wenn das vom Benutzer eingegebene Suchwort Mango ist, werden alle Ergebnisse korrekt zurückgegeben. Wenn die Wörter orange UND Mango sind, werden die Ergebnisse 1 und 2 (richtig) zurückgegeben. Nun, nehmen wir an, Banane ist ein Stoppwort (es ist nicht ... aber nehmen wir an, es ist), wenn die Suche nach Orange, Mango und Banane erfolgt, werden keine Ergebnisse zurückgegeben (weil Banane nicht im Volltextindex ist).

Was ich suche ist, wenn jemand anderes dieses Problem begegnet ist, und eine Möglichkeit hat, um es herum zu arbeiten. Art ein:

if 'banana' NOT STOP WORD match 'banana' against `words`. (OBVIOUSLY not real code). 

Oder ... bin ich nur die Stoppwortliste fallen gehen zu müssen ...

+0

was haben Sie versucht? Kannst du uns ein Beispiel geben? – jcho360

+0

Scheint, als ob keine der Antworten wirklich das bekommen hat, was Sie gesucht haben. Sie könnten immer Anwendungscode schreiben, um Stoppwörter (sowie zu kurze Wörter) manuell aus Ihrer Abfrage herauszufiltern. Das werden wir wahrscheinlich tun. –

+0

2017 und das gleiche Problem hier .. Scheint, dass Mysql Volltextsuche ist wirklich schlecht gestaltet und fehlt an grundlegenden Funktionen .. – jgr

Antwort

9

Sie können die Schlüsselwörter überprüfen, indem alle Stoppwörter zu vergleichen. Hier ist die Liste von stopwords Ich habe eine Lösung gefunden, um Stoppwörter von Volltext zu deaktivieren. Sie müssen nur .CNF Datei und fügen diese lokalisieren,

ft_stopword_file = "" 

Neustart mysql-Engine und den Wiederaufbau Indizes;

Hoffnung dieser Arbeit

+0

Ich dachte, dies könnte die Route sein, die ich mit gehen müsste. Ich habe nur gehofft, dass jemand anders eine cleverere Lösung hatte. Danke für deinen Beitrag. – dgeare

+0

Ich bin froh, es funktioniert für Sie :) –

3

Wie Volltext Stoppwörter in MySQL zu deaktivieren:

In my.ini Textdatei (MySQL):

ft_stopword_file = "" or link an empty file "empty_stopwords.txt" 
ft_min_word_len = 2 

// Ihre Mindestlänge festgelegt, aber bewusst sein, dass kürzere Wörter (3,2) die Abfragezeit dramatisch erhöhen werden, insbesondere wenn die Volltext-indizierten Spaltenfelder groß sind.

Speichern Sie die Datei, starten Sie den Server neu.

Der nächste Schritt sollte den Indizes mit dieser Abfrage zu reparieren sein:

REPAIR TABLE tbl_name QUICK. 

Allerdings wird dies nicht funktionieren, wenn Sie Tabelle Speicher-Engine InnoDB verwendet. Sie haben es zu MyISAM ändern:

ALTER TABLE t1 ENGINE = MyISAM; 

Also, noch einmal:

1. Edit my.ini file and save 
2. Restart your server (this cannot be done dynamically) 
3. Change the table engine (if needed) ALTER TABLE tbl_name ENGINE = MyISAM; 
4. Perform repair      REPAIR TABLE tbl_name QUICK. 

Beachten Sie, dass InnoDB und MyISAM ihre Geschwindigkeitsunterschiede haben. Ein schneller lesen, andere schreibt schneller (lesen Sie mehr darüber im Internet)

+1

Es sollte beachtet werden, dass InnoDB von MySQL 5.6 Volltext-Indizes –

1

deaktivieren Stoppwort für die Volltextsuche in MySQL mit dieser Schritte

1: open my.ini in mysql

2: Platz unter zwei Zeilen nach [mysqld] Zeile in my.ini (Suche [mysqld] in Datei)

ft_min_word_len=1 
ft_stopword_file="" 

3: starten Sie Ihren Server

4: reparieren Sie Ihre Tabelle mit unter Befehl

> repair table tablename; 

5: jetzt Ihre Suche funktioniert ....

0

versuchen MATCH mit ... ... Menschen IN BOOLEAN MODE Wie diese: WHERE MATCH (Autor, Titel) AGAINST (‘ "Ursprung von" 'IN BOOLEAN MODE);

+0

Stoppwörter sind nicht in Volltextindizes, so dass auch wenn Sie Boolean-Modus verwenden, wird es nicht zurückkehren etwas –

0

Einstellung ft_stopword_file = ""
nicht für mich arbeiten, ich bin mit InnoDB-Tabellen und MySQL 5.6 (Wörter stoppen noch nicht im Volltext-Indizes indiziert nach zugehörige Tabelle Optimierung)

diese Lösung funktioniert (auch wenn Sie sind nicht super user):

CREATE TABLE mydb.stopwordslist(value VARCHAR(20)) ENGINE = INNODB; 
INSERT INTO mydb.stopwordslist(value) VALUES ('skipthisword'); 

für alle Benutzer, aber Sie müssen noch Superbenutzerrechte:

SET GLOBAL innodb_ft_server_stopword_table = 'mydb/stopwordslist'; 

nur für den Benutzer (den man unter der Annahme, die Indizes und Aktualisieren von Spalten neu zu erstellen)

SET SESSION innodb_ft_user_stopword_table = 'mydb/stopwordslist'; 

, da es ein Session-Variable ist, wird es nicht dauern, wenn die Sitzung geschlossen ist, so stellen Sie sicher, Sie setzen auf jede Sitzung oder bevor Sie optimieren oder einfügen in Tabellen mit Volltextindex oder wenn Sie Spalte mit Volltextindex indexiert