FULLTEXT in MySQL

FULLTEXT in MySQL

am 11.01.2008 23:55:58 von Arno Lutz

Hallo,
ich möchte in einer Tabelle den Begriff "Cha-Cha" finden.
Mein Suchstring lautet:
$main="SELECT * FROM `noten` WHERE MATCH
(Titel,Komponist,Bearbeiter,Besetzung,Einstufung,Verlag,Schw ierigkeit,Art,Bemerkungen)
AGAINST ('$S_text' IN BOOLEAN MODE)";

In $S_text wird der Suchstring eingesetzt (hier ja dann 'Cha-Cha').
Der wird nicht gefunden!
Selbst wenn der Suchstring '"Cha-Cha"' geht es nicht.
Was mach ich falsch? (Suche mit anderen Begriffen ist Problem)

Danke


Gruß
Arno

Re: FULLTEXT in MySQL

am 12.01.2008 05:01:36 von B.Steinbrink

On Fri, 11 Jan 2008 22:55:58 +0000, Arno Lutz wrote:

> Hallo,
> ich möchte in einer Tabelle den Begriff "Cha-Cha" finden. Mein
> Suchstring lautet:
> $main="SELECT * FROM `noten` WHERE MATCH
>
(Titel,Komponist,Bearbeiter,Besetzung,Einstufung,Verlag,Schw ierigkeit,Art,Bemerkungen)
> AGAINST ('$S_text' IN BOOLEAN MODE)";
>
> In $S_text wird der Suchstring eingesetzt (hier ja dann 'Cha-Cha'). Der
> wird nicht gefunden!
> Selbst wenn der Suchstring '"Cha-Cha"' geht es nicht. Was mach ich
> falsch? (Suche mit anderen Begriffen ist Problem)

Der Bindestrich ist kein Wortbestandteil, trennt also die beiden Worte
"Cha" und "Cha" für die Suche. Du suchst also effektiv nach "Cha", was
wohl nicht die Mindestwortlänge erfüllt.

Björn

Re: FULLTEXT in MySQL

am 12.01.2008 13:55:34 von Stefan+Usenet

On Sat, 12 Jan 2008 04:01:36 +0000 (UTC) Björn Steinbrink wrote:
> > Selbst wenn der Suchstring '"Cha-Cha"' geht es nicht. Was mach ich
> > falsch? (Suche mit anderen Begriffen ist Problem)

> Der Bindestrich ist kein Wortbestandteil, trennt also die beiden Worte
> "Cha" und "Cha" für die Suche. Du suchst also effektiv nach "Cha", was
> wohl nicht die Mindestwortlänge erfüllt.

Um den Bindestrich suchbar zu machen, muss MySQL selbst compiliert
werden. Dabei ist in der Datei myisam/ftdefs.h die entsprechende
Definition abzuaendern:

| #define misc_word_char(X) ((X)=='\'' || (X)=='-')

Hier (Debian etch) war das in Zeile 27.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

Geht nicht!? Das gibt's nicht, jedenfalls nicht bei uns: Stefan.
(Sloganizer)

Re: FULLTEXT in MySQL

am 12.01.2008 14:12:00 von Arno Lutz

Björn Steinbrink schrieb:
> Du suchst also effektiv nach "Cha", was
>wohl nicht die Mindestwortlänge erfält.
das habe ich schon so vermutet :-(
Schade.
Gibt es einen Weg das zu umgehen?
Local auf meinem PC könnte ich MySQL ev. anpassen aber letztendlich geht es
ja um eine Suchfunktion auf einer Vereinshomepage welche bei einem
Freehoster liegt (freeprojekt.de).
Da habe ich nur auf Tabellen zugriff.

Gruß
Arno

Re: FULLTEXT in MySQL

am 12.01.2008 15:43:46 von Stefan+Usenet

On Sat, 12 Jan 2008 13:12:00 +0000 (UTC) Arno Lutz wrote:
> Gibt es einen Weg das zu umgehen? [...]
> Da habe ich nur auf Tabellen zugriff.

Dann nicht, nein. Die Bedeutung der einzelnen Zeichen ist
(ungluecklicherweise) fix im Programmcode festgelegt und
kann daher auch nur dort geaendert werden.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

Das Lachen der Kinder, oder warum Stefan so doof erbebt!
(Sloganizer)

Re: FULLTEXT in MySQL

am 12.01.2008 16:50:26 von Claus Reibenstein

Arno Lutz schrieb:

> ich möchte in einer Tabelle den Begriff "Cha-Cha" finden.
> Mein Suchstring lautet:
> $main="SELECT * FROM `noten` WHERE MATCH
> (Titel,Komponist,Bearbeiter,Besetzung,Einstufung,Verlag,Schw ierigkeit,Art,Bemerkungen)
> AGAINST ('$S_text' IN BOOLEAN MODE)";

So lautet Dein Suchstring mit Sicherheit nicht.

Das, was Du hier postest, ist weder ein Suchstring noch ein
SQL-Statement, sondern offensichtlich PHP-Code. Damit haben wir hier
nichts am Hut.

Wenn Du _hier_ Hilfe suchst, poste bitte nur das _reine_ SQL-Statement,
welches auch an den SQL-Server gesendet wird. Wenn Du Hilfe zu Deinem
PHP-Code suchst, frage bitte in der dazu passenden Gruppe (ich schlage
news:de.comp.lang.php.datenbanken vor).

> In $S_text wird der Suchstring eingesetzt (hier ja dann 'Cha-Cha').
> Der wird nicht gefunden!

Kein Wunder: Damit suchst Du einen String, der 'Cha' enthält ('Cha') und
gleichzeitig nicht enthält ('-Cha').

> Selbst wenn der Suchstring '"Cha-Cha"' geht es nicht.

Das allerdings ist merkwürdig. Ein Bug?

Versuch's mal mit '"Cha Cha"' (Leerzeichen statt '-') oder 'Cha\-Cha'
bzw. '"Cha\-Cha"' (maskiertes '-'). Vielleicht klappt davon was.

'Cha' alleine sollte es auch tun :-)

> Suche mit anderen Begriffen ist Problem

Weil die kein '-' enthalten.

Gruß. Claus

Re: FULLTEXT in MySQL

am 12.01.2008 16:53:25 von Axel Schwenke

Arno Lutz wrote:
> Björn Steinbrink schrieb:=20
>> Du suchst also effektiv nach "Cha", was=20
>> wohl nicht die Mindestwortlänge erfält.

> das habe ich schon so vermutet :-(
> Schade.
> Gibt es einen Weg das zu umgehen?

Der kanonische Weg, solche Probleme (mit z.B. auch "C++", "OS/2", ...)
zu umgehen besteht darin, eine such-(und find-)bare Normalform für jede=
s
Wort zu definieren und die dann zu indizieren.

Also z.B.

cha-cha -> chacha
C++ -> cplusplus
OS/2 -> oszwei

Im Kontext "MySQL-Volltextsuche" bedeutet das dann, daß du alle Spalten=

zweimal brauchst, einmal im Original und einmal normalisiert. Der Index
liegt dann jeweils auf der normalisierten Spalte.

Suchbegriffe muß man natürlich auch erst durch die Normalisierung jag=
en.


XL

Re: FULLTEXT in MySQL

am 12.01.2008 17:05:18 von Stefan+Usenet

On Sat, 12 Jan 2008 16:50:26 +0100 Claus Reibenstein wrote:
> > Selbst wenn der Suchstring '"Cha-Cha"' geht [Volltextsuche] nicht.
>
> Das allerdings ist merkwürdig. Ein Bug?

Nein.


beschreibt das eigentlich recht eindeutig:

| If you want to change the set of characters that are considered word
| characters, you can do so in two ways. Suppose that you want to treat
| the hyphen character ('-') as a word character. Use either of these
| methods:
|
| * Modify the MySQL source: In myisam/ftdefs.h, see the
| true_word_char() and misc_word_char() macros. Add '-' to one
| of those macros and recompile MySQL.
|
| * Modify a character set file: This requires no
| recompilation. The true_word_char() macro uses a
| “character type” table to distinguish letters and
| numbers from other characters. . You can edit the
| contents in one of the character set
| XML files to specify that '-' is a “letter.” Then
| use the given character set for your FULLTEXT
| indexes.
|
| After making the modification, you must rebuild the
| indexes for each table that contains any FULLTEXT
| indexes.

Ohne eigenen Server ist da also nicht viel zu machen, ob es gefaellt
oder nicht.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

Stefan - niemand blutet brauner und auch nicht endloser.
(Sloganizer)

Re: FULLTEXT in MySQL

am 12.01.2008 17:36:28 von Claus Reibenstein

Stefan Froehlich schrieb:

> On Sat, 12 Jan 2008 16:50:26 +0100 Claus Reibenstein wrote:
>
>>> Selbst wenn der Suchstring '"Cha-Cha"' geht [Volltextsuche] nicht.
>>
>> Das allerdings ist merkwürdig. Ein Bug?
>
> Nein.
>
>
> beschreibt das eigentlich recht eindeutig:
>
> | [...]
>
> Ohne eigenen Server ist da also nicht viel zu machen, ob es gefaellt
> oder nicht.

Also hilft in solchen Fällen wohl nur der lang(sam)e Umweg über (R)LIKE.
Schön ist das nicht ...

Gruß. Claus

Re: FULLTEXT in MySQL

am 12.01.2008 18:23:06 von Arno Lutz

Claus Reibenstein schrieb:

>Wenn Du _hier_ Hilfe suchst, poste bitte nur das _reine_ >SQL-Statement,
>welches auch an den SQL-Server gesendet wird.
SELECT * FROM `noten` WHERE MATCH
(Titel,Komponist,Bearbeiter,Besetzung,Einstufung,Verlag,Schw ierigkeit,Art,Bemerkungen)
AGAINST ('Cha-Cha' IN BOOLEAN MODE)

wenns noch deutlicher geht, bin ich für jeden Vorschlag dankbar!

>Wenn Du Hilfe zu Deinem
>PHP-Code suchst, frage bitte in der dazu passenden Gruppe
Es geht nicht um PHP, das geht nämlich.......
Der "Betreff" sagt es klar genug.

Gruß
Arno

Re: FULLTEXT in MySQL

am 12.01.2008 18:28:11 von Arno Lutz

Axel Schwenke schrieb:

>Der kanonische Weg, solche Probleme (mit z.B. auch .........
>Suchbegriffe muß man natürlich auch erst durch die Normalisierung jagen.

Ich bin nun zu dem Schluss gekommen, die Suche für diese speziellen Begriffe
in eine Liste (array) aufzunehmen, wird nach diesen gesucht, setze ich LIKE
anstatt MATCH/AGAINST ein.
Das scheint das kleinere Übel zu sein.

Danke an Alle

Arno

Re: FULLTEXT in MySQL

am 12.01.2008 18:35:12 von Axel Schwenke

Claus Reibenstein wrote:
> Stefan Froehlich schrieb:

>> Ohne eigenen Server ist da also nicht viel zu machen, ob es gefaellt
>> oder nicht.
>=20
> Also hilft in solchen Fällen wohl nur der lang(sam)e Umweg üb=
er (R)LIKE.
> Schön ist das nicht ...

Nö.




XL

Re: FULLTEXT in MySQL

am 12.01.2008 19:25:30 von Claus Reibenstein

Axel Schwenke schrieb:

> Claus Reibenstein wrote:
>
>> Schön ist das nicht ...
>
> Nö.
>
>

Wäre eine Alternative. Ist aber auch nicht schön.

Gruß. Claus

Re: FULLTEXT in MySQL

am 12.01.2008 19:41:58 von Axel Schwenke

Claus Reibenstein wrote:
> Axel Schwenke schrieb:
>=20
>> Claus Reibenstein wrote:
>>
>>> Schön ist das nicht ...
>> Nö.
>>
>>
>=20
> Wäre eine Alternative. Ist aber auch nicht schön.

Machen alle "richtigen" Search-Engines so. Allerdings tiefer unter der
Oberfläche. Und wenn man Prozeduren/Funktionen/Trigger verwendet, da=
nn
kann man das auch für MySQL ganz nett abstrahieren.


XL