index - php mysql full text search example




Volltextsuche mit InnoDB (6)

Ich entwickle eine hochvolumige Web-Anwendung, wo ein Teil davon eine MySQL-Datenbank von Diskussionsposts ist, die reibungslos auf 20 Millionen + Zeilen anwachsen müssen.

Ich plante ursprünglich, MyISAM für die Tabellen zu verwenden (für die integrierten Volltextsuchfunktionen ), aber der Gedanke, dass die gesamte Tabelle aufgrund einer einzigen Schreiboperation gesperrt ist, macht mich zu einem Shutter. Sperren auf Zeilenebene machen so viel mehr Sinn (ganz zu schweigen von den anderen Geschwindigkeitsvorteilen von InnoDB im Umgang mit riesigen Tabellen). Aus diesem Grund bin ich ziemlich entschlossen, InnoDB zu verwenden.

Das Problem ist ... InnoDB hat keine integrierten Volltextsuchfunktionen.

Sollte ich mit einem Suchsystem von Drittanbietern gehen? Wie Lucene(c++) / Sphinx ? Hat jemand von euch Datenbank Ninjas irgendwelche Vorschläge / Anleitungen? LinkedIn's zoie (basierend auf Lucene) zoie die beste Option im Moment zu sein ... ich bin auf Echtzeitfähigkeiten aufgebaut (was ziemlich kritisch für meine Anwendung ist). Ich zögere ein wenig, mich zu verpflichten, ohne einen Einblick zu haben ...

(FYI: auf EC2 mit High-Speicher-Rigs, mit PHP, um das Frontend zu bedienen)


Ich kann dafür bürgen, dass MyISAM-Volltext eine schlechte Option ist - sogar abgesehen von den verschiedenen Problemen mit MyISAM-Tabellen im Allgemeinen, habe ich gesehen, wie die Volltextsymptome aus dem Ruder laufen und sich selbst korrumpieren und MySQL regelmäßig abstürzen.

Eine dedizierte Suchmaschine wird definitiv die flexibelste Option sein - speichern Sie die Postdaten in MySQL / innodb und exportieren Sie den Text dann in Ihre Suchmaschine. Sie können ganz einfach einen periodischen vollständigen Index erstellen / veröffentlichen und Echtzeit-Index-Updates hinzufügen, wenn Sie das Bedürfnis verspüren und die Zeit dafür nutzen möchten.

Lucene und Sphinx sind gute Optionen, genauso wie Xapian , das schön und leicht ist. Wenn Sie die Lucene Route gehen, gehen Sie nicht davon aus, dass Clucene besser ist, auch wenn Sie es vorziehen, nicht mit Java zu kämpfen, obwohl ich nicht wirklich qualifiziert bin, das Für und Wider von beiden zu diskutieren.


Sie sollten eine Stunde verbringen und Installation und Probefahrt von Sphinx und Lucene durchführen. Prüfen Sie, ob Ihre Anforderungen in Bezug auf Datenaktualisierungen erfüllt werden.

Eines der Dinge, die mich an Sphinx enttäuscht haben, ist, dass es inkrementelle Inserts nicht sehr gut unterstützt. Das heißt, es ist sehr teuer, nach einer Einfügung neu zu indizieren, so teuer, dass die empfohlene Lösung darin besteht, Ihre Daten in ältere, unveränderte Zeilen und neuere, flüchtige Zeilen aufzuteilen. Jede Suche, die Ihre App durchführt, müsste also zweimal suchen: einmal im größeren Index für alte Zeilen und auch im kleineren Index für die letzten Zeilen. Wenn dies nicht in Ihre Nutzungsmuster passt, ist diese Sphinx keine gute Lösung (zumindest nicht in ihrer aktuellen Implementierung).

Ich möchte auf eine andere mögliche Lösung hinweisen, die Sie in Betracht ziehen könnten: Google Custom Search . Wenn Sie SEO für Ihre Webanwendung verwenden können, sollten Sie die Indexierungs- und Suchfunktion an Google auslagern und ein Google-Suchfeld in Ihre Website einbetten. Es könnte der kostengünstigste und skalierbarste Weg sein, um Ihre Website durchsuchbar zu machen.


Sphinx, wie du bemerkst, ist ganz nett für dieses Zeug. Die ganze Arbeit ist in der Konfigurationsdatei. Stellen Sie sicher, dass, was auch immer Ihre Tabelle mit den Strings ist, ein eindeutiger Integer-ID-Schlüssel ist, und Sie sollten in Ordnung sein.


Versuche dies

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0

Wenn alles andere fehlschlägt, gibt es immer soundex_match , was leider nicht wirklich schnell ist


Zusammen mit dem allgemeinen Ausstieg von MyISAM ist die InnoDB-Volltextsuche (FTS) endlich in MySQL 5.6.4 verfügbar.

Von http://dev.mysql.com/doc/refman/5.6/en/innodb-table-and-index.html#innodb-fulltext-index :

Diese Indizes werden physisch als ganze InnoDB-Tabellen dargestellt, auf die SQL-Schlüsselwörter wie die FULLTEXT-Klausel der Anweisung CREATE INDEX, die Syntax MATCH () ... AGAINST in einer SELECT-Anweisung und die Anweisung OPTIMIZE TABLE einwirken.

Während andere Engines über viele verschiedene Funktionen verfügen, ist dies InnoDB, also ist es nativ (was bedeutet, dass es einen Upgrade-Pfad gibt), und das macht es zu einer lohnenden Option.







innodb