[mySQL] Full-Text Searches

P13RR3

Lt. Commander
Registriert
Juli 2003
Beiträge
1.148
Hi ihr,

mittlerweile bin ich so langsam mit meinem Latein am Ende. Ich weiß nicht, woran es liegt, dass der Begriff "Nargilem" nicht gefunden wird.
Der Einfachheit halber hier einfach den phpMyAdmin Code:

Suchabfrage: (gibt 0 Zeilen zurück, sollten aber 3 sein)
Code:
SELECT *
FROM artikel
WHERE
MATCH (
name, hersteller
)
AGAINST (
'Nargilem'
)

CreateTable
Code:
CREATE TABLE IF NOT EXISTS `artikel` (
  `id` int(100) NOT NULL,
  `name` varchar(30) collate utf8_unicode_ci NOT NULL,
  `hersteller` varchar(20) collate utf8_unicode_ci default NULL,
  `beschreibung` varchar(200) collate utf8_unicode_ci default NULL,
  `bild` varchar(20) collate utf8_unicode_ci default NULL,
  PRIMARY KEY  (`id`),
  FULLTEXT KEY `name` (`name`,`hersteller`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Insert:
Code:
INSERT INTO `artikel` (`id`, `name`, `hersteller`, `beschreibung`, `bild`) VALUES
(1, 'Professional NP-620', 'Nargilem', NULL, NULL),
(2, '110', 'Ottoman', NULL, NULL),
(3, 'Professional Np-560', 'Nargilem', NULL, NULL),
(4, '610', 'Tn-Nargilem', NULL, NULL);

Habe eigentlich alles gleich gemacht, wie die offizielle Doku vorschlägt. Weiß jemand, an was es liegt?
Vielen Dank schon mal für eure Mühe :)
 
Hm, hatte ich übersehen. Puh, ich keine mich mit der Syntax von MySQL nicht so gut aus. Da gibt es ja für ein und denselben Befehl immer fünf Schreibweisen. Ich erstelle Fulltext-Schlüssel immer einfach mit FULLTEXT(`name`,`hersteller`). Aber wenn phpMyAdmin den von dir geposteten Code genereiert hat, dann dürfte er ja eigentlich nicht falsch sein.
 
warum so kompliziert wenn es auch einfach geht?

Code:
SELECT * FROM artikel
WHERE name LIKE '%Nargilem%' OR hersteller LIKE '%Nargilem%'

Oder spricht irgendwas gegen die Vorgehensweise?

Gruß
 
So hatte ich es vorher auch :)

Das Problem ist, wenn du jetzt nach "Nargilem 620" suchst...
 
tja, dann mach es so, wie alle anderen auch. Biete eine Suche an wo die Wörter entweder mit einem AND oder einem OR verknüpft werden...

Ansonsten wirst du das wohl nicht mit einem Select abbilden können.


Gruß
 
ich geh mal davon aus das du ne höhere programmiersprache nutzt um auf die db zuzugreifen...

schonmal darüber nachgedacht leerzeichen im suchstring als trennzeichen zu nutzen (stichwort explode) und dann für jeden suchbegriff das like statement zugenerieren? umständlich aber müsste funktionieren
 
>> tja, dann mach es so, wie alle anderen auch.

Was soll das heißen? Das in der Regel für Volltextsuchen nicht MATCH-AGAINST sondern LIKE eingesetzt wird?
 
Computer Freak schrieb:
>> tja, dann mach es so, wie alle anderen auch.

Was soll das heißen? Das in der Regel für Volltextsuchen nicht MATCH-AGAINST sondern LIKE eingesetzt wird?

Für Volltextsuchen solltest du schon MATCH ... AGAINST nehmen.

Allerdings kann ich für Volltextsuchen bei MySQL nur Sphinx empfehlen. Ich habe das bei unserem Forum eingebaut, und nur positive Erfahrungen gemacht.
Die Suche mit Sphinx ist nicht nur schneller, sonder lässt sich auch besser einstellen.

Gruß
Tobias
 
>> Für Volltextsuchen solltest du schon MATCH ... AGAINST nehmen.

Ich habe bis jetzt auch immer MATCH AGAINST für Volltextsuchen verwendet. Ich war nur über die Aussage von SirTwist überrascht, die ich so verstanden habe, als würden "alle anderen" immer nur LIKE benutzen.
 
... den Code da im 1.Post hat keiner ausprobiert und ist dabei vlt zufällig auf den Fehler gestoßen? :(
 
Ich habe deinen Beispielcode ausprobiert und keinen Fehler gefunden.
Der Grund, warum kein Ergebnis geliefert wird, liegt in der Funktionsweise von MATCH-AGAINST begründet.
Dein Suchergebnis ist leer, weil dein Suchbegriff "Nargilem" in mindestens 50% der Datensätze auftritt. Das Suchwort "Ottoman" liefert z.B. den einen Datensatz.
MATCH-AGAINST sollte daher nur bei großen Datenmengen eingesetzt werden.

Hier ein Link zum MySQL 5.1 Referenzhandbuch (deutsch), da ist alles gut beschrieben.


Ich würde MATCH-AGAINST vielleicht bei Tabellen benutzen, die große Textmengen beinhalten, da das Ergebnis der Abfrage gleich gewichtet wird.
Ich benutze immer LIKE bei solchen Suchen. Man kann durch Leerzeichen getrennt mehrere Suchbegriffe eingeben und den SQL-String daraus im Programm zusammensetzen (wie hier schon vorgeschlagen wurde).
Damit bekommt man alle richtigen Datensätze und es funktioniert auch auf anderen Datenbanken.
MATCH-AGAINST wäre mir da zu gefährlich, da das Ergebnis nicht kontrollierbar ist.
 
Zuletzt bearbeitet: (Ergänzung)
Zurück
Oben