2009-07-30 1 views
1

Ich benutze MySQL FULLTEXT Suche (im Natural Language Modus). Beispiel:Wie suche ich mit einer MySQL-Abfrage nach einem zweistelligen Wort?

SELECT Mem_id FROM Members WHERE MATCH (job_title) AGAINST ('".mysql_real_escape_string($keywordsWanted)."') 

Ich bemerkte, dass für "Web Entwickler" oder "PHP Coder" nicht allzu gut Benutzer arbeiten und ich hinzugefügt, so ft_min_word_len=3 zur MySQL-Konfigurationsdatei (/etc/mysql/my.cnf). Zweistellige Suchbegriffe sind jedoch immer noch ein Problem. z.B. "IT Unternehmer", "PR Manager", "3D Design", etc. Dies sind einige Strategien, die ich versuchen, dachte:

  • Verwenden ft_min_word_len=2 - Wird dies nicht der Index MASSIVE machen und die DB verlangsamen?
  • Ändern Sie die Abfrage, um LIKE in Fällen zu verwenden, in denen das Schlüsselwort aus weniger als 3 Zeichen besteht?
  • Allgemeine Akronyme automatisch in ganze Wörter übersetzen. z.B. IT -> „Information Technology“
  • Ändern Sie die Benutzeroberfläche so ein Javascript Popup warnt den Benutzer, dass zwei Zeichen Worte werden nicht gezählt, so dass sie die Frage
  • Verschieben verwenden Zend Lucene oder eine andere Suchtechnologie neu formulieren sollte

Was beraten Sie/Wie haben Sie dieses Problem angegangen?

Antwort

2

Wie wäre es mit der Suche mit mysql's pattern matching LIKE/REGEXP.

Zum Beispiel:

SELECT * FROM Members WHERE job_title LIKE '".$job_title[0]."%';

Oder können Sie reguläre Ausdrücke verwenden:

SELECT * FROM pet WHERE name REGEXP '^.....$';

Sie können auch die Berufsbezeichnung in einem separaten Feld oder Tabelle speichern.

+0

REGEXPs wie 'something $' erfordern Tabelle volle Scans –

+0

@ElvisCiotti das ist eine 3 Jahre alte Frage, es tut mir leid für meine Unverständnis damals. –

+0

3J alt, aber die Frage ist immer noch gültig :) –

3

Als Referenz, was ich am Ende getan habe, war "ft_min_word_len=2" in der MySQL-Konfigurationsdatei (/etc/mysql/my.cnf) zu ändern. Die Performance schien nicht merklich schlechter zu sein. Die Verwendung von FTS über LIKE/REGEXP hat den Vorteil der automatischen Ergebnisrangierung und der automatischen Pluralanpassung.

Übrigens hatte ich auch ein Problem mit einigen der MYSQL Stoppwörter. Insbesondere "es" und "uns" (weil sie "Informationstechnologie" und "Vereinigte Staaten" in meiner Problemdomäne bedeuten). Sie können eine Liste mit Stoppwörtern finden, die Sie hier verwenden können: http://dev.mysql.com/tech-resources/articles/full-text-revealed.html#stopwords. Ich habe diese Liste in einer Datei mit dem Namen /etc/mysql/stopword_list.txt gespeichert und dann "ft_stopword_file='/etc/mysql/stopword_file.txt'" zur MySQL-Konfigurationsdatei hinzugefügt. Dann habe ich MYSQL (sudo /etc/init.d/mysqld restart) neu gestartet und meinen FTS-Index gelöscht.

+0

Es funktioniert nicht mit innodb Volltextsuche, ich muss auch 'innodb_ft_min_token_size = 2' hinzufügen, damit es funktioniert. – jbmyid

Verwandte Themen