2009-04-10 17 views
0

Ich habe eine Tabelle, wo ich zum Beispiel Bilder und die Namen der Farben in diesen Bildern einfügen. Die Farbreihe sieht ungefähr so ​​aus wie "weiß, gelb, orange, schwarz".Workaround für die MySQL 50% -Schwelle für natürliche Suche

Da ich viele davon habe, beginnt die Schwelle von 50%, einige Farben abzufallen, da sie in den meisten Reihen erscheinen.

Der ganze Punkt der Tabelle ist in der Lage, nach Farbe zu suchen. Hat jemand eine Workaround, oder sollte ich einfach aufgeben und Sphinx oder etwas ähnliches machen? Das Neukompilieren von MySQL ist wahrscheinlich keine Option.

Ich habe gehört, dass einige Leute nur Dummy-Zeilen zum Tisch hinzufügen, um die 50% zu umgehen, aber das klingt ziemlich verzweifelt.

Antwort

6

Dies ist kein Problem mit Volltextsuche gelöst werden.

Stattdessen benötigen Sie eine untergeordnete Tabelle mit einer Zeile pro Farbe pro Bild.

Die Farbe sollte ein Fremdschlüssel für eine Farbtabelle sein, damit Ihre untergeordnete Tabelle tatsächlich eine Viele-zu-Viele-Beziehung zwischen Bild und Farbe wird.

create table color ( 
id int not null primary key auto_increment, 
name varchar64) 
); 

create table image_color (
    image_id int references image(id), 
    color_id int reference color(id), 
    unique constraint (image_id, color_id) 
) ; 

Dann Index die Beziehung (und gibt ihm eine eindeutige Einschränkung auf dem Tupel (image_id, color_id)

Dann alle Bilder mit einer bestimmten Farbe zu finden.

select a.* from image a 
join image_color b on (a.id = b.image_id) 
join color c on (b.color_id = c.id) 
where c.name = 'yellow'; 
+0

+1 zum Schreiben, was ich schreiben wollte, nur schneller –

2

Der ganze Punkt der Tabelle ist in der Lage, nach Farbe zu suchen. Hat jemand eine Umgehung

Ja, verwenden Sie BOOLEAN MODE Suchen, die nicht von der 50% -Schwelle betroffen sind und weniger unvorhersehbar sind.

Aber +1 zu tpdi Antwort, ich kann mir nicht vorstellen, warum Sie Volltextsuche statt einer einfachen Join-Tabelle verwenden, die die Farben auflistet. Es ist ein einfaches Ja/Nein-Problem mit logischem Speicher, es besteht keine Notwendigkeit, die Komplexität von Worttrennung, Wortanordnung, Stoppwörtern, zu kurzen Wörtern ("rot" wird nicht standardmäßig indexiert) und vor allem die Tatsache zu ziehen dass Sie fiese alte MyISAM-Tabellen verwenden müssen, um die Funktion überhaupt zu erhalten!

Die Volltextsuche ist im Allgemeinen schwierig und in MySQL nicht besonders gut implementiert. Es sollte Ihr letzter Ausweg sein, wenn Sie wirklich in großen Textabschnitten nach Wörtern suchen müssen und nicht als Feature der Wahl.

+0

Boolean-Modus gibt Ergebnisse, die im Grunde wertlos sind. –

+0

Warum sind sie "wertlos"? Was für "falsche" Ergebnisse siehst du? Es funktioniert gut für mich. – bobince

Verwandte Themen