[MySQL + PHP] Fulltext-Search liefert kein Ergebnis

Hi,

ich hab ein Problem mit MySQL und der Volltext-Suche:

So lautet mein “Pseudo-Query”.
Ein Beispiel:

= 0 Datensätze… wtf?

Hat da jemand ne Idee, was ich falsch mache?
Der Index ist richtig gesetzt, “windows” kommt vor… aber kein Ergebnis :frowning:

Danke im Voraus.

Vermutlich kommt es zu oft vor.

Informiere dich im Manual, was es mit stopwords bei der Volltextsuche auf sich hat.

hab ich schon… das kommt nicht selten vor, aber ich würd jetzt sagen bei 10 von 30 Datensätzen kommts vor…
Ich kann auch nach “Mac” suchen, was bei 5 von 30 Datensätzen vorkommt…

Er findet NICHTS.

Liegt dein Fulltext-Index auf exakt der Spaltenkombination, wie du sie hier angegeben hast?

Das ist noch zu unpräzise, um wirklich beurteilen zu können, was es bedeutet.
Wenn in den Datensätzen „windows … windows windows windows … windows … windows“ drin stünde, könnte das schon ausreichen, um das Wort in den kritischen Bereich zu hieven.

„Mac“ wirst du bei Defaulteinstellungen mit einer normalen Volltextsuche sowieso nicht finden, weil der Default für ft_min_word_len 4 ist.

So ein Problem ist schwer „von außen“ zu untersuchen, weil zu viele Faktoren unbekannt sind.
Neben den eigentlichen Daten auch weitere Aspekte der Serverkonfiguration; es wäre bspw. auch denkbar(!), dass eine eigene/erweiterte Stopword-Liste verwendet wird, in die „windows“ mit hineingepackt wurde.

Ist ja mein vServer… :smiley:
Hab da keine eigene Stopwords-Liste definiert.
Ich schau mir das dann nochmal an, um präzisere Informationen liefern zu können…

EDIT:
Ach ja, der Index ist exakt so definiert.

Im BOOLEAN MODE ist die 50% Limitierung (wenn ein Wort in mehr als 50% der Datensätze vorkommt, wird es ignoriert) und die Relevanzsortierung deaktiviert. Also vergleiche doch mal die Ergebnisse mit und ohne BOOLEAN MODE :wink:

mit: 0 Ergebnisse
ohne: 0 Ergebnisse
:nutz:

Nutzt du auch “ENGINE=MyISAM;”?
Also ist’s ne MyISAM Table?
Sind die Felder: CHAR, VARCHAR, oder TEXT?

PS: du könntest den Query auch ansich anpassen… funktionieren sollte es jedoch gleich:

<span class="syntaxdefault">$sql </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">'SELECT COUNT(*) AS `count` FROM `'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">DB_PREFIX</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'profiles_data` WHERE MATCH(`cpu_name`,`gpu`,`software_os`) AGAINST(\''</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">mysql_real_escape_string</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$string</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$db</span><span class="syntaxkeyword">).</span><span class="syntaxstring">'\''</span><span class="syntaxkeyword">.(</span><span class="syntaxdefault">$boolean</span><span class="syntaxkeyword">?</span><span class="syntaxstring">' IN BOOLEAN MODE'</span><span class="syntaxkeyword">:</span><span class="syntaxstring">''</span><span class="syntaxkeyword">).</span><span class="syntaxstring">')'</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> </span>bin mir bei deinem Code net ma sicher ob “count” nicht sogar nen Problem bereiten könnte… kp wie es MySQL mit der Groß-/kleinSchreibung sieht. Jedenfalls ists mit dem grave accent sicher :wink:

MyISAM :wink:
Und die Felder sind TEXT-Felder :slight_smile:

Den Query lass ich extra so, MySQL hat damit kein Problem (benutz ich auch bei anderen Queries wo ich mit COUNT(*) arbeite), und die Variablen sind bereits escaped (einige zeilen vorher)

Danke.

[quote=“DHMH”][]
Den Query lass ich extra so, MySQL hat damit kein Problem [][/quote]Weil du “Glück” hast^^
Tabellennamen sollte man nun mal Kennzeichnen, 1. weiß MySQL dann was abgeht, 2. hast du kein Problem mit Reservierten Keywords.
Wie gesagt… gerade beim “count” bin ich mir net sicher da es “COUNT” gibt…

Es geht aber eben ums Prinzip, nur weil MySQL schlecht geschrieben ist, daher “vieles” frisst, oder eben nen Browser der auch aus scheiße Gold macht, muss man es ja net so lassen^^ Machs richtig oder gar net :wink:

bzgl. deines Problems… solltest vielleicht mal jemanden via Teamviewer gucken lassen… wird glaube ich zu Umständlich das so zu klären :wink:
Zumindest muss man davon ausgehen das du weißt was du tust bzw. alles richtig machst, wenn’s dann doch net ist muss man entweder bei NULL anfangen oder aber findet’s nie^^ [size=85](oder mit Glück)[/size]

Du kannst deine Tabellen, Spalten, … gerne kennzeichnen. Nur leider gehören die Backticks nicht zum SQL-Standard, und du verlierst die Kompatibilität zu jedem anderen RDBMS.

Da Konvertiert man’s mit nem Regex Replace^^ Ne Sache von paar Sekunden^^
SQLite ist z.B. grave accent compatibel.

Man macht sowieso in MySQL unter Umständen Sachen anders als woanders, vor allem den PHP Code muss man für C/C++ etc. anpassen da ist nen Regex für die Querys wirklich lächerlich^^
Kannst du nen konkretes Beispiel geben wo es zu umständlich wäre wenn die Querys, MySQL angepasst sind? [size=85](also eben wegen Kompatibilität)[/size]

Hat das noch irgendwas mit dem eigentlichen Thema zu tun, was ihr zwei hier diskutiert …?

Ja, Volltextsuche auf diese Art und Weise z.B.
In Query, in der du das drin hast, kannst du hinsichtlich „Kompabilität“ zu anderen DBMS gleich vergessen.
Also ist das, was ihr beide hier gerade diskutiert, irgendwie reichlich OT.

Das Problem sind nicht die Backticks, sondern die reservierten Keywords die man damit als Namen verwenden kann. Genau diese Namen sind i.d.R. bei anderen DB-Systemen auch reserviert.
Das Einfachste ist es einfach eindeutige Namen zu vergeben.

offtopic… meint ihr, mir damit helfen zu können?.. :ps:

scheinbar kommt der begriff doch zu oft vor.

Wie kann ich denn checken, ob ein Begriff zu oft vorkommt?
Soll ich einfach checken, ob 60% der Tabelle „windows“ enthält? :ps: :nutz: wäre zu dirty mmn.