MySQL-Abfrage geht nicht?

pl_90

Angesehenes Mitglied
Eine Frage...

Wieso geht diese Abfrage:
SELECT * FROM tabelle WHERE MATCH(spalte_1, spalte_2) AGAINST ('suchbegriff' IN BOOLEAN MODE);

... aber diese nicht?

SELECT * FROM tabelle WHERE MATCH(spalte_1, spalte_2) AGAINST ('suchbegriff');


hab mal sogar so getestet wie bei MySQL http://dev.mysql.com/doc/refman/5.1/de/fulltext-search.html beschrieben ist, aber geht irgendwie nicht... Fulltext ist also da.. aber kein Plan was los ist...

Server Version: 5.0.32-Debian_7etch5-log
MySQL-Client-Version: 5.0.32
phpMyAdmin - 2.9.1.1-Debian-6


kann bitte mir jemand helfen?
Danke schön im Voraus.
 
QUOTE
SELECT * FROM tabelle WHERE MATCH(spalte_1, spalte_2) AGAINST ('suchbegriff');



Die Abfrage sollte nach meiner Meinung schon gehen. Ich vermute bei dir liegt der Fehler woanders. Hast du schon mit mysql_error() oder mysql_errno() (siehe PHP Manual: mysql_error()...) versucht, um nähere Angaben des Fehlers zu erhalten?

 
Könnte es sein das deine zweite Abfrage einfach die 50-Grenze überschreitet?
Wenn jedes Wort im Text in mindestens 50 Prozent aller Datensätze auftaucht, liefert die Abfrage kein Ergebnis.
Die Boolesche-Suche verwendet diese 50%-Marke nicht und liefert entsprechend auch Ergebnisse.
 
Zur Ergänzung:

Eventuell fehlt bei dir ein FULLTEXT KEY Index für die Spalte spalte_1 und spalte_2.
 
ja, hab alles versucht... also liefert keine Ergebnisse und keine Fehler...
wink.gif

die 50 % Grenze weiß nicht genau, ich glaube nicht, da ich ca. 15000 verschiedene Einträge habe...
aber ich habe gerade eben festgestellt, dass die Abfrage geht, wenn man nur eine Spalte verwendet, also so:

SELECT * FROM tabelle WHERE MATCH(spalte_1) AGAINST ('suchbegriff');

und das geht dann nicht:

SELECT * FROM tabelle WHERE MATCH(spalte_1, spalte_2) AGAINST ('suchbegriff');

woran kann das eigentlich liegen? das ist irgendwie voll komisch... hm...
 
Poste uns doch am Besten mal die komplette Struktur der Tabelle wie sie im Moment aussieht ;-)
 
ok.. so sieht das ding aus
wink.gif


CREATE TABLE `DAW_DATAS` (
`ID` int(11) NOT NULL auto_increment,
`TOKEN` varchar(50) NOT NULL,
`EROTIK` tinyint(4) NOT NULL default '0',
`TITEL` varchar(255) NOT NULL,
`KEYWORDS` varchar(255) NOT NULL,
`TEXT` longtext NOT NULL,
`META_TEXT` varchar(255) NOT NULL,
`WTAGS` tinytext NOT NULL,
`URL` varchar(255) NOT NULL,
`DATUM` varchar(20) default NULL,
PRIMARY KEY (`ID`),
FULLTEXT KEY `TITEL` (`TITEL`),
FULLTEXT KEY `TEXT` (`TEXT`),
FULLTEXT KEY `META_TEXT` (`META_TEXT`),
FULLTEXT KEY `WTAGS` (`WTAGS`),
FULLTEXT KEY `URL` (`URL`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
TEXT ist ein allgemeines Sql-Schlüsselwort.

Es ist nie eine gute Idee, Schlüsselwörter für Spaltennamen zu verwenden. Das müßte man normalerweise maskieren.

Ändere den Spaltennamen mal ab (nur nicht auf ntext - das ist auch ein Schlüsselwort).
 
hab auf BODY_TEXT geändert.. trotzdem geht nicht wenn ich zwei spalten angebe (wie oben #5)... hm...
 
Jetzt habe ich mal in der mySql-Hilfe nachgesehen (ich verwende das ja sonst nicht):

QUOTE Die MATCH()-Spaltenliste muss exakt mit der Spaltenliste in einer FULLTEXT-Indexdefinition der Tabelle übereinstimmen, sofern für MATCH() nicht der Modus IN BOOLEAN MODE aktiviert ist.


Du hast oben nur Indices für Einzelspalten definiert. Also kann das (ohne BOOELEAN MODE) auch nur für Einzelspalten funktionieren, nicht für zwei Spalten.

Erstelle einen zusätzlichen Index für zwei Spalten.

PS: Lenny hat das oben (#4) bereits geschrieben.
 
Hab ich doch eigentlich:

CREATE TABLE `DAW_DATAS` (
`ID` int(11) NOT NULL auto_increment,
`TOKEN` varchar(50) NOT NULL,
`EROTIK` tinyint(4) NOT NULL default '0',
`TITEL` varchar(255) NOT NULL,
`KEYWORDS` varchar(255) NOT NULL,
`TEXT` longtext NOT NULL,
`META_TEXT` varchar(255) NOT NULL,
`WTAGS` tinytext NOT NULL,
`URL` varchar(255) NOT NULL,
`DATUM` varchar(20) default NULL,
PRIMARY KEY (`ID`),
FULLTEXT KEY `TITEL` (`TITEL`),
FULLTEXT KEY `BODY_TEXT` (`BODY_TEXT`),
FULLTEXT KEY `META_TEXT` (`META_TEXT`),
FULLTEXT KEY `WTAGS` (`WTAGS`),
FULLTEXT KEY `URL` (`URL`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
Ich glaube Lenny und jAuer meinen einen Mehrfeld-Index, wie zB. sowas:
CODE ALTER TABLE `daw_datas` ADD FULLTEXT `TITELANDTEXT` (`TITEL` ,`BODY_TEXT`);


Du musst halt wissen für welche Felder du Mehrfeld Fulltext Abfragen machen willst, und dafür eigenen Index anlegen.
Evtl. solltest du die Struktur mal überdenken, du hast da momentan schon soviele Fulltext-Indizes, das kann nicht gut sein. Ein Insert dauert da bei 15000 vorhandenen Datensätzen bestimmt schon Sekunden...
 
QUOTE (Maik @ So 25.05.2008, 00:13) Ich glaube Lenny und jAuer meinen einen Mehrfeld-Index, wie zB. sowas:

CODE ALTER TABLE `daw_datas` ADD FULLTEXT `TITELANDTEXT` (`TITEL` ,`BODY_TEXT`);


Du musst halt wissen für welche Felder du Mehrfeld Fulltext Abfragen machen willst, und dafür eigenen Index anlegen.
Evtl. solltest du die Struktur mal überdenken, du hast da momentan schon soviele Fulltext-Indizes, das kann nicht gut sein. Ein Insert dauert da bei 15000 vorhandenen Datensätzen bestimmt schon Sekunden...

eigentlich nicht... geht ganz schnell... ich versuche gleich dieses mehrfaches, aber eigentlich hab ich so etwas ähnliches gemacht.... CREATE TABLE ... (... FULLTEXT (TITEL,BODY_TEXT)) aber mysql hat selber "weiter gemacht" also den oberen code erzeugt.. hm... ich versuche nochmal...
 
so... danke leute... jetzt gehts... also das mit dem mehrfachen index hat schon mal geklappt.. so sieht jetzt das ganze aus:

CREATE TABLE `DAW_DATAS` (
`ID` int(11) NOT NULL auto_increment,
`TOKEN` varchar(50) NOT NULL,
`EROTIK` tinyint(4) NOT NULL default '0',
`TITEL` varchar(255) NOT NULL,
`KEYWORDS` varchar(255) NOT NULL,
`BODY_TEXT` longtext NOT NULL,
`META_TEXT` varchar(255) NOT NULL,
`WTAGS` tinytext NOT NULL,
`URL` varchar(255) NOT NULL,
`DATUM` varchar(20) default NULL,
PRIMARY KEY (`ID`),
FULLTEXT KEY `BODY_TEXT` (`BODY_TEXT`),
FULLTEXT KEY `TWTU` (`TITEL`,`WTAGS`,`URL`),
FULLTEXT KEY `META_TEXT` (`META_TEXT`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

und meine jetzige Abfrage so:

SELECT *, MATCH (TITEL,WTAGS,URL) AGAINST ('suchbegriff') AS SCORE FROM DAW_DATAS WHERE MATCH (TITEL,META_TEXT,URL) AGAINST ('suchbegriff' IN BOOLEAN MODE) ORDER BY SCORE DESC LIMIT XX,YY


das geht wie gesagt, aber wenn daran etwas falsch ist, sagt bitte bescheid.. weiß noch jemand zufällig, wie man Relevanz mit php berechnet? weil SCORE bei dieser Abfrage ist die Relevanz, jedoch wird z.B. 6.545985649 ausgegeben, ich möchte aber für den Besucher in % 0-100% anzeigen... weiß jemand wie das geht? danke schön..
smile.gif
 
QUOTE (pl_90 @ So 25.05.2008, 14:04) weiß noch jemand zufällig, wie man Relevanz mit php berechnet? weil SCORE bei dieser Abfrage ist die Relevanz, jedoch wird z.B. 6.545985649 ausgegeben, ich möchte aber für den Besucher in % 0-100% anzeigen... weiß jemand wie das geht? danke schön..
smile.gif


Du kannst das Problem wie folgt lösen:

1) Ermittle in der Ergebnismenge die maximale Relevanz. Diese speicherst du in einer Variable z.B. $rMaxScore ab.
2) Für jeden Datensatz (in der Ergebnismenge) kannst du den Prozentsatz wie folgt berechnen:

100 * ($rScore / $rMaxScore) = ... [%], wobei $rScore die Relevanz des Datensatzes ist.
 
achso.. danke.. nur wie soll ich die maximale Relevanz ($rMaxScore) ermitteln?
 
Ganz einfach: Du fügst in deiner Abfrage eine absteigende Sortierung nach Relevanz hinzu. Die Relevanz der ersten Datensatz ist somit die maximale Relevanz (entspricht 100%) in der Ergebnismenge, diese kannst du separat in einer Variable abspeichern....
 
em.. sorry iregendwie check ich das doch nicht... kommt nur scheiße bei mir raus...
kann mir jemand bitte ein beispiel schreiben? vielen danke im voraus...
smile.gif
 
Zurück
Oben