MySQL: Umgekehrte Volltext Suche

Tommy57

Erfahrenes Mitglied
Hallo,

ich bekomme vom User einen Text mit etwa 100-200 Buchstaben und möchte diesen nach Begriffen durchsuchen, die ich in der Datenbank in einer Spalte stehen habe. Aktuell löse ich das normal mit LIKE und %, aber das scheint mir nicht performant zu sein.

Code:
CONCAT(' ', USERTEXT, ' ') LIKE CONCAT('%', item_value, '%')

Hat jemand eine Idee, wie man hier am Besten vorgehen könnte?

Gruß, Tommy
 
Hast du Mengenangaben?
Performant wirst du das eh nicht hinkriegen, da du alle Indexe und Vorteile vergessen kannst.
Per REXP bist du aber auf der sichereren Seite. Den %Baum% findet auch Baumstamm.
zudem kannst du bei regexp die Grosskleinschreibung ignorieren

http://sqlfiddle.com/#!9/c8dd09/6
SQL:
where usertext regexp concat('[[:<:]]', item_value, '[[:>:]]');

Die [[:<:]] bezeichnet den Wortanfang, rsp [[:>:]] das Wortende
 
Hi Yaslaw, ist REGEX nicht langsamer als LIKE? Außerdem dürfen dann in der Spalte keine Sonderzeichen etc stehen, da sie dann vom REGEX interpretiert werden?
 
Ob es langsamer ist? Keine Ahnung.
Jepp, gewisse Zeichen könnten zu Problemen. Aber ich hab ja keine Ahnung was in dem Feld steht
Dafür ist die Worttrennung sicher richtig.
Es hat alles seine Vor- und Nachteile. Aber es gibt keine performante Variante.
 
Die Tabelle hat aktuell rund 300.000 Zeilen. Eine Abfrage dauert etwa 400ms. Das Problem war bisher, dass ich die Abfrage so lange ausgeführt habe, bis der Text keine Treffer mehr erzielt hat. Dafür habe ich immer nach dem besten Treffer, den entsprechenden Begriff aus dem Text entfernt. Das mache ich jetzt in einem SQL Statement und habe damit statt 10 Durchläufe nur noch einen. Damit ist mir geholfen.

Danke auf jeden Fall für deine Hilfe.
 

Neue Beiträge

Zurück