Mustervergleich mit Wildcard am Anfang?

Mustervergleich mit Wildcard am Anfang?

am 01.12.2007 11:12:26 von Lars Kampmann

Hallo,

ich muss einen Mustervergleich mit Wildcard am Anfang machen, in etwa
so: Ich suche $teilstring in $string.

$string = 'abc12345x' (oder 'abcdef12345' oder 'ab12345xyz')
$teilstring = '12345'
Der Match ist grundsätzlich eindeutig.

Bisher lief das Ganze in einer Doppelschleife (20.000 x 5.000 Datensätze).

$anfrage = "SELECT SPALTE FROM $tab WHERE SPALTE LIKE '%$teilstring%'";

Da bei Wildcard am Anfang keine Indezies verwendet werden, dauert das
entsprechend lange, bis 10 Minuten. Nehme ich die Wildcard vorne raus
flutscht es.

Erst dachte ich, FULLTEXT ist die Lösung, aber auch da geht ja keine
Wildcard am Anfang:

$anfrage = "SELECT SPALTE FROM $tab WHERE MATCH (SPALTE) AGAINST
('$teilstring*' IN BOOLEAN MODE";

Ein Sternchen vorne geht ja wohl nicht.

Ich glaube, dass mir Relevanz nicht viel bringt, bin am testen.

Ich habe auch überlegt, was mit separaten Tabellen zu machen oder
Zeichen für Zeichen abzuschneiden. Ansonsten weiß ich nicht mehr weiter.

Danke für Tipps.

Gruß Lars

Re: Mustervergleich mit Wildcard am Anfang?

am 01.12.2007 12:47:06 von Weinzierl Stefan

Lars Kampmann schrieb:
> Hallo,
>
> ich muss einen Mustervergleich mit Wildcard am Anfang machen, in etwa
> so: Ich suche $teilstring in $string.
>
> $string = 'abc12345x' (oder 'abcdef12345' oder 'ab12345xyz')
> $teilstring = '12345'
> Der Match ist grundsätzlich eindeutig.
>
> Bisher lief das Ganze in einer Doppelschleife (20.000 x 5.000 Datensätze).
>
> $anfrage = "SELECT SPALTE FROM $tab WHERE SPALTE LIKE '%$teilstring%'";
>
> Da bei Wildcard am Anfang keine Indezies verwendet werden, dauert das
> entsprechend lange, bis 10 Minuten. Nehme ich die Wildcard vorne raus
> flutscht es.
>
> Erst dachte ich, FULLTEXT ist die Lösung, aber auch da geht ja keine
> Wildcard am Anfang:
>
> $anfrage = "SELECT SPALTE FROM $tab WHERE MATCH (SPALTE) AGAINST
> ('$teilstring*' IN BOOLEAN MODE";
>
> Ein Sternchen vorne geht ja wohl nicht.
>
> Ich glaube, dass mir Relevanz nicht viel bringt, bin am testen.
>
> Ich habe auch überlegt, was mit separaten Tabellen zu machen oder
> Zeichen für Zeichen abzuschneiden. Ansonsten weiß ich nicht mehr weiter.
>
> Danke für Tipps.
>
> Gruß Lars

Füge eine 2. Spalte ein, in der du die Zeichenkette in umgekehrter
Reihenfolge stehen hast.

Stefan

Re: Mustervergleich mit Wildcard am Anfang?

am 01.12.2007 18:30:55 von Claus Reibenstein

Weinzierl Stefan schrieb:

> Lars Kampmann schrieb:
>
>> [Fullquote]

Wozu?

> Füge eine 2. Spalte ein, in der du die Zeichenkette in umgekehrter
> Reihenfolge stehen hast.

Was soll das bringen?

Gruß. Claus

Re: Mustervergleich mit Wildcard am Anfang?

am 01.12.2007 21:07:15 von Weinzierl Stefan

Claus Reibenstein schrieb:
> Weinzierl Stefan schrieb:
[...]
>> Füge eine 2. Spalte ein, in der du die Zeichenkette in umgekehrter
>> Reihenfolge stehen hast.
>
> Was soll das bringen?

Nichts, ich war nur auf den Wildcard am Anfang fixiert und hab den am
Ende übersehen.

Stefan

Re: Mustervergleich mit Wildcard am Anfang?

am 02.12.2007 10:55:07 von Christian Kirsch

Lars Kampmann schrieb:
> Hallo,
>
> ich muss einen Mustervergleich mit Wildcard am Anfang machen, in etwa
> so: Ich suche $teilstring in $string.
>
> $string = 'abc12345x' (oder 'abcdef12345' oder 'ab12345xyz')
> $teilstring = '12345'
> Der Match ist grundsätzlich eindeutig.
>
> Bisher lief das Ganze in einer Doppelschleife (20.000 x 5.000 Datensätze).
>
> $anfrage = "SELECT SPALTE FROM $tab WHERE SPALTE LIKE '%$teilstring%'";
>
> Da bei Wildcard am Anfang keine Indezies verwendet werden, dauert das
> entsprechend lange, bis 10 Minuten. Nehme ich die Wildcard vorne raus
> flutscht es.

Gibt es irgendwelche Regeln für "teilstring"? Im Beispiel sind das ja
alles Ziffern... wenn Du sicher bist, dass das die häufigste Suche ist,
dann könntest Du eine zweite Spalte anlegen, in die Trigger jeweils den
Ziffernteil von "string" eintragen. Nicht schön.

Re: Mustervergleich mit Wildcard am Anfang?

am 02.12.2007 13:38:47 von Lars Kampmann

Hallo und danke,

>>> Füge eine 2. Spalte ein, in der du die Zeichenkette in umgekehrter
>>> Reihenfolge stehen hast.
>>
>> Was soll das bringen?
>
> Nichts, ich war nur auf den Wildcard am Anfang fixiert und hab den am
> Ende übersehen.

Ich hatte auch schon dran gedacht, mache es jetzt auch so, weil der Rest
der vorn und hinten eine Wildcard braucht relativ gering ist und in
diesem Fall vernachlässigbar.

Gruß Lars

Re: Mustervergleich mit Wildcard am Anfang?

am 02.12.2007 13:39:49 von Lars Kampmann

> Gibt es irgendwelche Regeln für "teilstring"? Im Beispiel sind das ja
> alles Ziffern... wenn Du sicher bist, dass das die häufigste Suche ist,
> dann könntest Du eine zweite Spalte anlegen, in die Trigger jeweils den
> Ziffernteil von "string" eintragen. Nicht schön.
Das Beispiel ist nicht die Regel, es können auch Schrägstriche o.a. drin
sein. Gruß Lars