• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Suchsystem

Status
Für weitere Antworten geschlossen.

lama

Neues Mitglied
Hallo!
Kann mir hier jemand erklären, bzw. auf ein Tutorial verweisen, wie ich ein Suchsystem mit PHP und MySQL realisiere? Ich will den Inhalt meiner Homepage durchsuchen nach einem eingegebenen Suchbegriff und dann soll man einen Link sehen, der zu dem begriff, der dann am besten hervorgehoben ist, führt. Ich hab schon gehört dass ich das wohl mit SQL Verwirklcihen kann/sollte.


Vielen Dank für eure Hilfe!
 
Da musst du mit FULLTEXT Index arbeiten, einen FULLTEXT Index ueber die Spalte mit den Texten anlegen:

Code:
ALTER TABLE _tabelle_ ADD FULLTEXT ( _spalte_ )

Nach einem Suchbegriff suchen:

Code:
SELECT
  _ID_,
  _spalte_,
  MATCH (
    _spalte_
  )
  AGAINST (
                'Suchbegriff'
  ) as rev
  FROM _tabelle_
  WHERE
  MATCH (
    _spalte_
  )
  AGAINST (
    '+Suchbegriff'
    IN BOOLEAN MODE 
  )
  ORDER BY rev DESC

Hier mal ein Beispiel aus meinem Code:

PHP:
$searchstring = $db->escape(str_replace(array(chr(252),chr(246),chr(228),chr(223)),array('ue','oe','ae','ss'),$searchstring));
$args = explode(' ',$searchstring);
$match      = '';
$bin_match  = '';
foreach($args as $arg)
{
    if($arg{0} == '-')
    {
        $bin_match .= ' '.str_pad($arg,5,'_');
    }
    elseif($arg{1} == '+')
    {
        $bin_match .= ' '.str_pad($arg,5,'_');
        $match     .= ' '.str_pad(substr($arg,1),4,'_');
    }
    else
    {
        $bin_match  .= ' +'.str_pad($arg,4,'_');
        $match      .= ' '.str_pad($arg,4,'_');
    }
}
$sql = 'SELECT
            SQL_CALC_FOUND_ROWS
            produkte.id, 
            produkte.vk, 
            produkte.artnr, 
            produkte.status, 
            MATCH (
                meta,
                designer
            )
            AGAINST (
                \''.$match.'\'
            ) as rev
        FROM produkte, produkte_data
        WHERE
        (
                MATCH (
                    meta,
                    designer
                )
                AGAINST (
                    \''.$bin_match.'\'
                    IN BOOLEAN
                    MODE 
                )
            OR
                artnr LIKE \''.trim($match).'%\'
        )
        AND
            produkte.id = produkte_data.id
            ORDER BY rev DESC, artnr ASC 
            LIMIT '.$get_site * 30 .', 30';
 
geht auch, liefert auch bessere ergebnisse nach meinen erfahrungen.

das machst du am besten in dem du in arrays deine tabellen und tabellenfelder festlegst, die durchsucht werden müssen und sie dann mit foreach abarbeitest

aus den suchbegriffen machst du mittel einer einfachen stringfunktion sowas:
"der suchbegriff"
wird zu
"%der%suchbegriff%"

oder besser noch machst du das daraus

"%der%" OR $datenbankfeld LIKE "%suchbegriff%"

das leifert die besten ergebnisse. am vorteilhaftesten is halt wenn man alle inhalte in der selben tabelle in der selben column hat, dann wirds ned so verzwickt...
 
Gute ergebnisse? das ist schwachsinn. LIKE sortiert ja die Einträge nicht mal nach der Häufigkeit der Begriffe und kann nicht mit unterschiedlichen Schreibweisen von Umlauten fertig werden.
Ausserdem belastet es die Datenbank 1000 mal mehr,da für die Anfragen keine Indizes verwendet werden können. => Um Text zu durchsuchen _IMMER_ Volltextsuche, deswegen heisst sie auch so.
 
Geht nicht auch so was wie das hier?
PHP:
SELECT * FROM tabelle WHERE result LIKE suchbegriff
 
die volltextsuche is doch total buggy... und liefert weniger brauchbare ergebnisse, zumindest wars bei mir so.. ausserdem kann man das mit der häufigkeit auch mit php erledigen. wieso sollte LIKE die datenbank mehr belasten als match?

kann man denk ich bei einer kleineren website vernachlässigen.

naja
Nicht wirklich nein.

klar kann man so eine suche machen..

SELECT *felder* FROM *tabelle* WHERE *Bedingung* ORDER BY *reihenfolge* LIMIT

also

SELECT * FROM `tabelle` WHERE `inhalt` LIKE "%suchbegriff%" ORDER BY `name` ASC LIMIT 0, 10

% damit auch " .... suchbegriff ... " gefunden wird und nich nur alles wo nur "suchbegriff" stimmt.
LIMIT deshalb, damit die abfrage nicht zu lang dauert, für 0 musst du halt eine variable verwenden und pagination machen.

wenn deine abfrage aus 2 wörtern besteht, dann musst du die leerzeichen durch % ersetzen, du musst aber auch auf jeden fall dann einen filter verwenden der abfragen wie
" "
oder
"%"

nicht zulässt, sonst wird alles gefunden
 
Zuletzt bearbeitet von einem Moderator:
die volltextsuche is doch total buggy...
Welche DBMS benutzt du? bei mir läuft sie in einer komerziellen Anwendung Eins A. [MySQL 5.0.24]
und liefert weniger brauchbare ergebnisse, zumindest wars bei mir so..
Du musst nur wissen wie sie funktioniert.
ausserdem kann man das mit der häufigkeit auch mit php erledigen.
Bist du WAHNSINNIG? MySQL ist 10000 mal schneller (Wegen dem Index)
wieso sollte LIKE die datenbank mehr belasten als match?
Wegen dem Index? Was meinst du warum man Datenbanken überhaupt einsetzt? Weil sie so toll aussehen?
kann man denk ich bei einer kleineren website vernachlässigen.
Warum überhaupt hinweise geben, ist doch eh scheiss egal. Soll er doch beepworld benutzen!
ausserdem es geht hier auch um andere leute, die html.de per google finden und vll auch mal ne grössere seite durchsuchen wollen.
naja


klar kann man so eine suche machen..
Nein kann man nicht, wie du es hier vorschlägst geht es aber. ist aber was vollkommen anderes.
SELECT *felder* FROM *tabelle* WHERE *Bedingung* ORDER BY *reihenfolge* LIMIT

also

SELECT * FROM `tabelle` WHERE `inhalt` LIKE "%suchbegriff%" ORDER BY `name` ASC LIMIT 0, 10
Das ist schwachsinn, ich will nach relevanz nicht nach Alphabetischer Reihenfolge sortieren.
% damit auch " .... suchbegriff ... " gefunden wird und nich nur alles wo nur "suchbegriff" stimmt.
EBEN
LIMIT deshalb, damit die abfrage nicht zu lang dauert, für 0 musst du halt eine variable verwenden und pagination machen.
Du erklärst alles aber nicht den begriff pagination?
(Wie willst du das ueberhaupt machen, ohne SQL_CALC_FOUND_ROWS)
ps: noch ein grund warum seine sql abfrage nicht funktioniert/sinnlos ist.

wenn deine abfrage aus 2 wörtern besteht, dann musst du die leerzeichen durch % ersetzen, du musst aber auch auf jeden fall dann einen filter verwenden der abfragen wie
" "
oder
"%"

nicht zulässt, sonst wird alles gefunden
Volle Zustimmung.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben