psi-4ward / news4ward

Contao Extensions: News/Blog based on contentelements
13 stars 12 forks source link

Mysql: Can't find FULLTEXT index #106

Open floespen opened 3 years ago

floespen commented 3 years ago

Nach einer Migration von einem Server mit einer Mariadb Datenbank (10.0.38) zu einem Managed Server mit MySQL (5.7.34-2) bekommen wir beim Aufruf der Blogseiten folgenden Fehler:

request.CRITICAL: Uncaught PHP Exception Doctrine\DBAL\Exception\DriverException: "An exception occurred while executing 'SELECT *, author AS authorId, (SELECT title FROM tl_news4ward WHERE tl_news4ward.id=article.pid) AS archive, (SELECT jumpTo FROM tl_news4ward WHERE tl_news4ward.id=article.pid) AS parentJumpTo, (SELECT name FROM tl_user WHERE id=author) AS author, MATCH (keywords,tags,title,description) AGAINST (' schneidspalt2 schneidspalt3' IN BOOLEAN MODE) AS score FROM tl_news4ward_articleWithTags AS article WHERE id<>'52' AND article.pid IN('2') AND (article.start='' OR article.start<1627375816) AND (article.stop='' OR article.stop>1627375816) AND article.status='published' AND MATCH (keywords,tags,title,description) AGAINST (' schneidspalt2 schneidspalt3' IN BOOLEAN MODE) > 0 ORDER BY score DESC LIMIT 0,3': SQLSTATE[HY000]: General error: 1191 Can't find FULLTEXT index matching the column list" at ..

Offenbar stimmt etwas mit den Indexierungen nicht? Das Problem trat zwischenzeitlich bei mir lokal auch auch kurz auf, ließ sich aber über das Ausführen des Install Tools (contao/install) beheben. Beim Ausführen von contao-console contao:migrate gibt es auch einen Fehler: [ERROR] Argument 1 passed to Contao\InstallationBundle\Database\Installer::execCommand() must be of the type string, int given, called in /usr/www/users/staging/vendor/contao/core-bundle/src/Command/MigrateCommand.php on line 271 Letzterer tritt aber auch bei Mariadb auf und muss nicht direkt mit dem oberen Problem zusammenhängen.

amenk commented 3 years ago

Wir sind auf Lösungsuche auf Stackoverflow

https://stackoverflow.com/questions/68633441/fulltext-index-not-matching-column-list-on-mysql

Es scheint so, als könne MySQL 5.7 diese Queries garnicht. Aber ich glaube eigentlich nicht, dass das Modul nicht mit MySQL kompatibel ist - also rührt der Fehler vielleicht woanders her?

amenk commented 3 years ago

Bis MySQL 5.6 gingen diese Queries noch - für neuere MySQL versionen ist wohl eine Anpassung nötig. Wir würden einen MR machen.

amenk commented 3 years ago

Aktueller Stand:

So wie ich das verstehe, hat das mal in MySQL 5.6 funktioniert, wurde aber entfernt, weil es sowieso nicht performant war. Um nach den Artikelfeldern und der Tag Liste gleichzeitig zu matchen, müsste man die Tags in die Artikeltabelle mit aufnehmen.

Siehe hier:

https://stackoverflow.com/a/68670908/288568

4-col FT

If you decide that you must have tags in the FULLTEXT index, then the commalist of tags in the main table and get rid of the tags table. Then you need some stored procedures/functions to handle add-tag, del-tag, etc. Tip: FIND_IN_SET('foo', tags) will > come in handy for testing for a particular tag.

Aktuell gibt es ja im Contao Backend einen Editor bei dem die Tags per "+" Button zugefügt werden können. Es ist die Frage ob man diesen Editor aufgibt und einfach eine Kommagetrennte Tagliste abfragt die dann in die Datenbank gespeichert wird. Alternativ könnte man auch mit Stored Procedures arbeiten die die Tagliste im Artikel quasi als "index" synchron halten - aber das würde bestimmt zu Problemen führen, wenn jemand das Modul auf nem Server einsetzt der solche Stored Procedures nicht unterstützt.

Alternativ könnte man den Code in vendor/psi/news4ward_related/Module/Related.php:128 umbauen, so dass die Tags getrennt gematcht werden, aber dann kommt man vermutlich zu einem anderen Ergebnis..