Ich lese Volltextsuche sehe aber keinen Fulltextindex.
Ich würde die Mysql Volltextsuche verwenden.
Relevanz von Suchergebnissen
Collapse
X
-
Guest replied
-
Dann ist UNION vermutlich besser.
Könnte man wie beschrieben mit IF zwar auch hinbekommen, aber k.A. ob das letztendlich effektiver wäre.
Leave a comment:
-
Okay, klingt ja bis hierhin schon vielversprechend.
Also Ich möchte die Suchergebnisse in der Reihenfolge:
Treffer in Namen (nach id sortiert)
Treffer in Beschreibung (nach id sortiert)
evtl. noch eine 3. abgefragte Spalte nach id sortiert
im Idealfall natürlich noch einmalig, denn es kann vorkommen das es einen Treffer in "Namen" gibt und dieser Eintrag auch ein Treffer bei der "Beschreibung" ist.
Zusätzlich für eine Blätterfunktion der Ergebisse der kompletten Abfrage ein "Limit" mit Startwert und Anzahl der Datensätze der gesamten 2-3 Abfragen.
Kam jetzt einigermaßen Verständlich rüber auf was ich hinaus will? ;o)
Leave a comment:
-
Das käme so in etwas dem Selberbasteln der Fulltext-Search von MySQL gleich. Dass du diese auf eigene Faust performanter implementiert bekommst, als das bereits eingebaute Feature, glaube ich weniger.Originally posted by Berni View Postwarum sammelst du nicht alle Wörter in einer Wortdatenbank
In einer 2. Tabelle merkst du dir wie häufig ein Wort in einem Text vorgekommen ist. Die Häufigkeit ist gleich eine Größe für die Relevanz der Begriffe.
Sagt wer?Originally posted by Joxa View PostUNION ist ja eher zur Abfrage bei verschiedenen Tabellen gedacht.
UNION ist dazu gedacht, zwei Abfrageergebnisse gleicher Struktur zu einem zusammenzufassen.
Wo die "herkommen" oder wie selektiert wurde, ist UNION egal.
Was soll das jetzt wieder heissen? (Drück dich mal etwas präziser aus.)Und ein einheitliches Limit bekomme ich damit auch nicht hin
Mit LIMIT kann man bei UNION unterschiedliches bewirken - je nachdem, "wo" man es einsetzt.
Leave a comment:
-
Also die Abfrage die nicht nach relevanz sortiert wäre:
So bekomme ich alle Treffer nach der ID sortiert ausgegeben. Mein Ziel ist es allerdings zuerst die Treffer in denen die Suchphrase im Namen gefunden wurde, und anschließend die Treffer in denen die Suchphrase in der beschreibung gefunden wurde, ausgeben zu lassen.PHP Code:SELECT name, beschreibung FROM tabelle Where name LIKE %suchphrase% or beschreibung LIKE %suchphrase% ORDER BY id;
Zuerst dachte ich an ein Abfrage in der Art:
UNION ist ja eher zur Abfrage bei verschiedenen Tabellen gedacht.PHP Code:SELECT name, beschreibung
FROM tabelle
Where
name LIKE %suchphrase% ORDER BY id
UNION ALL
SELECT name, beschreibung
FROM tabelle
Where
beschreibung LIKE %suchphrase% ORDER BY id;
Und ein einheitliches Limit bekomme ich damit auch nicht hin, so wie ich das gesehen habe. Deswegen müsste ich eh die Ergebnisse in ein Array schreiben und mit diesem dann weiter arbeiten. Oder habe ich da etwas falsch verstanden?
Leave a comment:
-
warum sammelst du nicht alle Wörter in einer Wortdatenbank
In einer 2. Tabelle merkst du dir wie häufig ein Wort in einem Text vorgekommen ist. Die Häufigkeit ist gleich eine Größe für die Relevanz der Begriffe.
z.b.
Die Struktur beinhaltet noch weitere Informationen die du ja löschen kannst.PHP Code:CREATE TABLE `searchdb_index_de` (
`FK_WORDS` BIGINT(10) UNSIGNED NOT NULL DEFAULT '0',
`FK_ID` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0',
`S_TABLE` CHAR(15) NOT NULL DEFAULT '',
`SCORE` TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
`DIR` VARCHAR(100) NOT NULL DEFAULT '',
`FILE` VARCHAR(100) NOT NULL DEFAULT '',
PRIMARY KEY (`FK_ID`, `FK_WORDS`, `S_TABLE`, `DIR`, `FILE`)
)
COLLATE=latin1_swedish_ci
ENGINE=MyISAM
ROW_FORMAT=DYNAMIC
AVG_ROW_LENGTH=52
CREATE TABLE `searchdb_words_de` (
`ID_WORDS` BIGINT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`wort` CHAR(50) NOT NULL DEFAULT '',
PRIMARY KEY (`ID_WORDS`),
UNIQUE INDEX `wort` (`wort`)
)
COLLATE=latin1_swedish_ci
ENGINE=MyISAM
ROW_FORMAT=FIXED
AUTO_INCREMENT=90244
AVG_ROW_LENGTH=59
Leave a comment:
-
hm, das scheint relativ performancelastig zu sein.
Also wird es wohl doch eher darauf hinauslaufen
das ich es auf 3 Abfragen aufteile und dann die Arrays zusammenführe.
Leave a comment:
-
Man könnte mittels IF() "Hilfsspalten" basteln, die jeweils 1 oder 0 zugewiesen bekommen, je nachdem ob in Spalte X ein Treffer vorliegt oder nicht, und dann nacheinander nach diesen Werten sortieren.
Leave a comment:
-
Relevanz von Suchergebnissen
Hallo,
ich bastel gerade an einer Volltextsuche.
Die Suche bekommt einen String übergeben.
Jetzt habe ich in der DB 3 Spalten die durchsucht werden sollen.
Ansich ja kein Thema, allerdings sollen die Spalten jetzt unterschiedliche Relevanzen erhalten.
Soll heißen, in den Treffern sollen die Ergebnisse dann sortiert sein nach,
Treffer in Spalte 1, Treffer in Spalte 2, Treffer in Spalte 3.
Bei einer einfachen Abfrage mit OR und AND bekomme ich ja die Treffer nicht in dieser Sortierung raus. Klar könnte ich 3 Abfragen machen und dann alles in ein Array speichern und weiter verarbeiten. Ich würde aber gern mit Limit von MySQL arbeiten, da jedesmal eine recht große Zahl abgefragt wird.
Ich habe mir auch schon "union" zum verbinden der verschiedenen Querys angesehen, denke aber das es eher suboptimal dafür geeignet ist,
oder hat jemand schon andere Erfahrungen damit gemacht?Tags: None
Leave a comment: