MySQL Volltextsuche - Problem mit dem / im Suchbegriff

web4free

Neuer Benutzer
Beiträge
3
Hallo liebes Forum,

Soweit verstehe ich den Aufbau und das Abarbeiten einer Volltextsuche in MySQL.
Es funktioniert auch alles wie gewünscht. Nur bei bestimmten Suchanfragen scheitert die Suche und ich vermute, dass es in diesem Falle beim / liegt.

Folgendes wird gesucht und als Ergebnis zurück geliefert (Beispiele):
domain.at - findet alles zu domain.at
domain.at front - findet alles zu domain.at und front
domain.at/front liefert mir aber alles zu domain.at zurück und nicht wie gewünscht zu domain.at/front

Die Struktur der Suchtabelle würde so aussehen:
CREATE TABLE `suchtabelle` (
`id` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`asistId` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0',
`suchfeld` TEXT COLLATE latin1_german2_ci NOT NULL ,
PRIMARY KEY ( `id` ) ,
UNIQUE KEY `insId` ( `asistId` ) ,
FULLTEXT KEY `suchfeld` ( `suchfeld` )
) ENGINE = MYISAM DEFAULT CHARSET = latin1 COLLATE = latin1_german2_ci;

Die Abfrage löse ich folgenderweise:
SELECT SQL_CACHE b.*
FROM suchtabelle AS a
JOIN asist AS b ON
MATCH (a.suchfeld) AGAINST ('orf.at/front' IN BOOLEAN MODE)
AND b.Id = a.asistId
AND b.gesperrt = '0'
ORDER BY b.Domain, b.Page ASC
LIMIT 0 , 30

Ich versteh nicht, wo da der Wurm begraben ist.
Besten Dank für Eure Denkanstöße

lg.
Werner
 
Werbung:
Hinweis: Weil MySQL die C-Escape-Syntax in Strings verwendet (z. B. ‘\n’ zur Darstellung eines Zeilenwechsels), müssen Sie jedes ‘\’, das Sie in LIKE-Strings verwenden, verdoppeln. Um beispielsweise nach ‘\n’ zu suchen, geben Sie es als ‘\\n’ an. Um nach ‘\’ zu suchen, geben Sie es als ‘\\\\’ an; dies ist erforderlich, weil Backslashs einmal vom Parser und dann noch einmal bei Durchführung des Mustervergleichs umgewandelt werden – so bleibt für den Vergleich ein einzelner Backslash übrig.
Ich gehe mal davon aus das MATCH AGAINST wie LIKE arbeitet und in diesem Zusammenhang das \ vor dem Buchstaben speziell interpretiert wird (ohne jetzt alles gelesen zu haben). Siehe:
https://dev.mysql.com/doc/refman/5.1/de/string-comparison-functions.html
 
Ich gehe mal davon aus das MATCH AGAINST wie LIKE arbeitet und in diesem Zusammenhang das \ vor dem Buchstaben speziell interpretiert wird (ohne jetzt alles gelesen zu haben). Siehe:
https://dev.mysql.com/doc/refman/5.1/de/string-comparison-functions.html

Hallo Ukulele,
Ich konnte das Problem nun etwas eingrenzen, was wiederum das Problem verschärft :-(
Es dürfte nicht nur am / sondern wie es aussieht an den Punkten im Suchbegriff liegen.
Der Suchbegriff "advertorial" liefert mir 21 Ergebnisse zurück in denen der gesuchte Begriff beinhaltet ist - das ist richtig so.
Wenn ich das etwas einschränken möchte mit dem Begriff "advertorial.kur" sollten jetzt nur die 17 relevanten Datensätze zurückgeliefert werden - leider aber bekomme ich alle Ergebnisse wieder angezeigt die "advertorial" beinhaltet haben.

So wie es aussieht muß ich wohl bestimmte Zeichen wie zB. / und . gesondert behandeln - ein vorangestelltes \ fruchtet da leider auch nicht :-(
 
Escape Sequenzen lautet der passende Begriff. Gewisse Zeichen haben in deinem Suchbegriff eine spezielle Bedeutung wie z.B. Platzhalterfunktionen, auch auf % und _ solltest du achten. Mit replace() kann man diese Zeichen aber z.B. verdoppeln dann sollten sie immer korrekte Anwendung finden. Dazu aber bitte in der Doku jeweils nachschauen.
 
Escape Sequenzen lautet der passende Begriff. Gewisse Zeichen haben in deinem Suchbegriff eine spezielle Bedeutung wie z.B. Platzhalterfunktionen, auch auf % und _ solltest du achten. Mit replace() kann man diese Zeichen aber z.B. verdoppeln dann sollten sie immer korrekte Anwendung finden. Dazu aber bitte in der Doku jeweils nachschauen.

Vielen Dank für den Hinweis. Jetzt bin ich echt fündig geworden :)
Ich hab zu verworren gedacht und hab dabei übersehen, dass der . eigentlich als Komma gilt und somit ein Seperator ist **grumml**

Ich habs zwar jetzt nicht elegant über die DB lösen können, hab mir aber eine kleine Schleife geschrieben, die mir die Ergebnisse jetzt so liefert wie Sie sollen.

$AktuellerSuchbegriff = '';
$AsB = explode(' ', $_GET['therm']);
foreach($AsB as $value) {
if(preg_match("/\./", $value)) {
$AktuellerSuchbegriff .= '+"' . $value . '" ';
} else {
$AktuellerSuchbegriff .= '+' . $value . ' ';
}
}

Besten Dank nochmals für den Gedankenstoß.
lg. Werner
 
Werbung:
Zurück
Oben