PHP MySql - Match Against

Hugo Stiglitz

Ensign
Registriert
Aug. 2015
Beiträge
191
Guten Abend,

ich bin fast am verzweifeln.... seit 4 Stunden kämpfe ich mit folgenden Problem.

Unter XAMPP lokal funktioniert die Suche mit diesem String einwandfrei:

SELECT * FROM table WHERE MATCH (label) AGAINST ("+iphone +plus +akku" IN BOOLEAN MODE);
(Dieser Query ist ein Ausschnitt)


Ich lade das selbe Skript auf den Webspace, und es funktioniert nur mehr, wenn die Schreibweise beachtet wird.
Also: +iPhone +Plus +Akku
Aber ich will das nicht. Ich will, das match against die Groß- und Kleinschreibung ignoriert!

Was ich bereits versucht habe:
Alles auf UTF-8bin gestellt. (ident zu Xampp)
Die " mit ' ersetzen war erfolglos.

Die Tabelle bei Xampp ist InnoDB und die am Server MyIsam.
(Kann ich aber leider am Server nicht ändern.)

Achja: "FULLTEXT" für label existiert.

Im Internet habe ich versucht Antworten zu finden - aber es war nicht wirklich was hilfreiches dabei.

Weiß vielleicht von euch einer, was das Problem sein könnte?
 
Hugo Stiglitz schrieb:
Die Tabelle bei Xampp ist InnoDB und die am Server MyIsam.

[...]

Weiß vielleicht von euch einer, was das Problem sein könnte?
Vermutlich ist genau das dein Problem.

Welcher MySQL Version benutzt du? Da gibt's je nach Version ein paar Unterschiede / Einschränkungen. Z.B.
MySQL 5.5 : Full-text indexes can be used only with MyISAM tables
MySQL 8.0 : InnoDB tables require a FULLTEXT index on all columns of the MATCH() expression

EDIT: Hier noch was:
By default, the search is performed in case-insensitive fashion. However, you can perform a case-sensitive full-text search by using a binary collation for the indexed columns. For example, a column that uses the latin1 character set of can be assigned a collation of latin1_bin to make it case-sensitive for full-text searches.
(Quelle: https://dev.mysql.com/doc/refman/5.5/en/fulltext-natural-language.html )

EDIT2: Das hier dürfte helfen: https://stackoverflow.com/questions...ft8-general-ci-is-case-sensitive-for-fulltext
 
Zuletzt bearbeitet:
Hi, danke für deine Antwort.

Unter Xampp rennt: 10.1.9-MariaDB

am Webspace rennt: 5.5.62

Aber ich glaube, da scheint etwas nicht zu passen. Habe soeben beide Versionen mit SELECT version(); festgestellt. Ich glaube wohl kaum, dass die am Server SO weit hinten ist?
 
Keine Ahnung ob es bei dir das Problem ist, aber hast du gelesen:
By default, the search is performed in case-insensitive fashion. To perform a case-sensitive full-text search, use a case-sensitive or binary collation for the indexed columns. For example, a column that uses the utf8mb4 character set of can be assigned a collation of utf8mb4_0900_as_cs or utf8mb4_bin to make it case-sensitive for full-text searches.

Quelle: https://dev.mysql.com/doc/refman/8.0/en/fulltext-natural-language.html
 
Alternativ kannst du natürlich einfach eine Extra Spalte anlegen, wo der Server zusätzlich sämtlichen Text in Lowercase einträgt. Und dann führst du deine Suche einfach auf dieser Spalte aus.
 
YES

Ich habe jetzt die Kollation auf utf8_unicode_ci gestellt und es klappt. Zumindest FAST.
Jetzt habe ich wieder ein anderes Problem - und zwar sind am Webspace ein paar (zwar nicht nennenswert aber dennoch) Ergebnisse mehr, als am Xampp.
Ergänzung ()

benneque schrieb:

Gerade gesehen - habe ich schon so umgesetzt. Scheint fast zu passen.
 
Welche Ergebnisse denn? Das wäre ja interessant.

Ansonsten ist das ein wildes Rumgerate. Wahrscheinlich matcht der Case-insensitive?

Lg
 
Ich hab meinen Fehler schon gefunden - und er ist logisch.

Also ich habe die Kollation auf utf8_unicode_ci gestellt und es funktioniert.
Der Rest ist mein Denkfehler, den ich miteingebaut habe.

Wenn ich hinten ein "AND LIKE '%VALUE%' ranmache ist es klar, dass der nicht nur die Ergebnisse mit den Matches findet, sondern auch weitere, die die Kriterien erfüllen.

Im oben genannten Beispiel wollte ich +iphone +plus +akku suchen - aber mit AND LIKE %6% hinten dran.

Natürlich findet der nun einen Pseudoartikel auch, und reiht ihn nach hinten.

Weil wenn beispielsweise im label vorkommt: iPhone 8 Plus Akku 2600 findet der den, weil die 3 Matches vorhanden sind und die 6 in der Zahl vorkommt.
Aber das ist jetzt unwichtig bzw. der Vollständigkeit halber, weil du gefragt hast.


Das Problem wurde dank @benneque behoben - Vielen Dank :-)
 
Zurück
Oben