Ankündigung

Einklappen
Keine Ankündigung bisher.

MySql Artikelsuche aufbauen...

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySql Artikelsuche aufbauen...

    Hallöchen,

    ich schon wieder
    Ich werde in Kürze die Artikelsuche umsetzen und ich hätte dazu gerne etwas Feedback von euch.

    Nun eigentlich geht es lediglich darum die Artikel mittels des Titels zu durchsuchen und bei der Sucheingabe hatte ich es mir so vorgestellt das ich die Eingabe erst mal aufteile:
    $all = explode(' ', $_POST['suche']); // Leerzeichen als worttrennung

    Nun mittels foreach() eine Positiv und Negativ,- Liste anlegen, bei Wörtern die ein - (Minus) vorangestellt haben wandern diese in die Negativliste für Wörter die nicht enthalten sein dürfen.

    Mit LIKE() könnte ich die Positivliste abarbeiten aber es wäre wahrscheinlich sinnvoll wenn man das dann mit ORDER BY verknüpfen könnte damit Titel mit den am meisten enthaltenen Schlagwörtern oben stehen. Leider weiß ich nicht wie.

    Bei der Negativliste weiß ich auch nicht wie ich es machen soll, da müsste es ja nen Gegensatz zu LIKE() geben das der Eintrag nicht selektiert wird wenn eines der Wörter vorkommt.

    Ich hoffe ihr könnt und werdet mir weiterhelfen.


    MfG: Paykoman

  • #2
    In der Doku zu LIKE dürfte auch NOT LIKE auftauchen
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Hast du die Möglichkeit Solr oder Elasticsearch zu nutzen? Die können sowas iirc schon alleine.
      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

      Kommentar


      • #4
        Zitat von VPh Beitrag anzeigen
        Hast du die Möglichkeit Solr oder Elasticsearch zu nutzen? Die können sowas iirc schon alleine.
        machst Du dem pgsql Freund neuerdings mit Elasticsearch Konkurrenz; könnte spannend werden

        Kommentar


        • #5
          Neee, aber zu versuchen mit "like" eine Suchengine nachzubauen könnte schwierig werden.

          Eine Möglichkeit für die Datenbank wäre sonst:
          Die Felder die durchsucht werden sollen zu splitten und die einzelnen Wörter in eine extra Tabelle zu schreiben
          - da könnte man sich dann eine einfachere Query zusammenbauen,
          - die dann wahrscheinlich auch einen Index nutzen kann
          Damit könnte man dann auch die Sortierung erschlagen,
          - weil man die Ergebnisse aus der Positiv-Liste zählen kann,
          - wenn man zusätzlich noch kennzeichnet in welchem Feld das Wort vorkommt kann man auch eine Gewichtung (Titel wiegt mehr als Beschreibung) einbauen

          Naja, sowas können die Lucene-Dinger halt schon von alleine
          [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
          [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

          Kommentar


          • #6
            LIKE und NOT LIKE sind SQL Grundlagen.

            Nun eigentlich geht es lediglich darum die Artikel mittels des Titels zu durchsuchen
            Da braucht es dann auch nicht mehr.

            Kommentar


            • #7
              In den nächsten Sätzen werden die Anforderungen dann um Postiv- und Negativ-Liste sowie ums Ranking ergänzt.
              [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
              [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

              Kommentar


              • #8
                Na, da warten wir mal ab,
                Er hat ja mit der Umkreissuche noch genug Heimarbeit

                Kommentar


                • #9
                  Also Solr oder Elasticsearch sagt mir nichts und habe auch noch nicht nach gesehen, möglich wäre es sicherlich habe root...

                  Bin aber inzwischen auf die Volltextsuche bei MyISAM gestoßen, ich denke sofern das gute Stück mal so arbeitet wie es das soll, wäre das bestimmt ausreichend, zumal es auch direkt die Sortierung mit übernimmt.
                  Leider habe ich das Problem das nicht mehr als 1 Eintrag selektiert wird

                  Tabelle auc_article:
                  Code:
                  id | tit
                  1 | Volltextsuche eine runde Sache
                  2 | eine runde Sache
                  3 | Volltextsuche mit etwas anderem
                  Um Fehlerquellen aus zu sortieren habe ich ein einfaches Query genommen:
                  Code:
                  // 0 Ergebnisse
                  SELECT id, tit FROM <pf>auc_article WHERE MATCH (tit) AGAINST ('eine runde' IN NATURAL LANGUAGE MODE)
                  
                  // 0 Ergebnisse
                  SELECT id, tit FROM <pf>auc_article WHERE MATCH (tit) AGAINST ('runde' IN NATURAL LANGUAGE MODE)
                  
                  // 1 Ergebnis
                  SELECT id, tit FROM <pf>auc_article WHERE MATCH (tit) AGAINST ('anderem' IN NATURAL LANGUAGE MODE)
                  Ist mir ein absolutes Rätzel denn in der Doku und stack wirds nicht anders gemacht
                  Habe die Tabelle vorher auch auf die richtige Engine gestellt:

                  ALTER TABLE auc_article ENGINE=MyISAM;

                  und den Index hinzugefügt:

                  CREATE FULLTEXT INDEX search ON auc_article (tit)

                  @protestix: Die Umkreissuche ist bereits fertig =)

                  Kommentar


                  • #10
                    Zitat von protestix Beitrag anzeigen
                    LIKE und NOT LIKE sind SQL Grundlagen.


                    Da braucht es dann auch nicht mehr.
                    Richtig, sehe ich auch so, was fehlt ist die Sortierung, welche in der Volltextsuche inbegriffen wäre.

                    Kommentar


                    • #11
                      Die richtige Engine für Mysql lautet InnoDB, alles andere ist Steinzeit.
                      Du solltest dir auch die Einstelungen zu Volltextsuche mit MyIsam durchlesen, wenn du das anwenden willst.
                      Ein Forum ist kein Vorleseservice.

                      Davon ab, was willst du wirklich suchen, beschreibe mal alles was du vor hast, ist wohl einfacher.

                      EDIT:
                      was fehlt ist die Sortierung
                      ORDER BY in Abhängigkeit von der richtigen Kollation natürlich.

                      Kommentar


                      • #12
                        Es fehlt: Fuzzysearch
                        Buchstabendreher, ein Zeichen zuviel oder zuwenig.. eine gute Suche sollte auch Fehlertolerant sein
                        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                        Kommentar


                        • #13
                          So, ich mache es doch mit LIKE und NOT LIKE, die Volltextsuche war mir zu kurios.
                          Hier mein Snippet mit dem ich die Funktion getestet habe, die WHERE Clausel habe ich jetzt weg gelassen, denn dort wo es eingesetzt wird gibt es diverse Arrays aus denen sich am Ende das Query zusammensetzt. Es müsste daher noch nen WHERE hits > 0 rein.

                          PHP-Code:
                          $searchString trim($_POST['sucheingabe'], ' ');
                          $searchItems = [[],[]]; // positive / negative list
                          $all explode(' 'str_replace(','''$searchString));
                          foreach( 
                          $all as $item ){
                              
                          $to = ( substr($item01) != '-' ) ? 1;
                              
                          $searchItems[$to][] = ltrim($item'-');
                          }

                          $searchWhere '';
                          if( !empty(
                          $searchItems[1]) ){
                              
                          $searchWhere 'tit NOT RLIKE \'^'.implode('|^'$searchItems[1]).'\'';
                          }
                          $searchHits '';
                          if( !empty(
                          $searchItems[0]) ){
                              
                          $searchHits ', ((tit LIKE \'%'.implode('%\') + (tit LIKE \'%'$searchItems[0]).'%\') ) AS hits';
                              
                          $searchWhere .= ' AND hits > 0';
                          }


                          $query $cols.$searchHits.' FROM <pf>auc_article WHERE '.$searchWhere.' ORDER BY hits DESC';


                          // Die richtige Zusammensetzung schaut bei mir dann so aus:
                          $cols 'a.id, typ, tit, stit, start, ends, co, zip, lat, lng, bold, pp, db, bid, bids, ct, '.$searchHits.'pic.ext, pic.srv, pic.ar, s.sp';
                          $limit = ( $useGeo ) ? 120 50;
                          $query $cols.' FROM <pf>auc_article AS a
                              LEFT JOIN <pf>media_pic AS pic ON pic.oid = CONCAT(\'auc-\', a.id) AND pic.id = 1
                              LEFT JOIN <pf>auc_ship_rule AS s ON s.tid = CONCAT(a.user, \'-\', a.ss) AND s.sto = :iso AND s.w1 <= a.we  AND s.w2 >= a.we
                              WHERE '
                          .implode(' AND '$selectQuery[0]).' '.implode(', '$selectQuery[1]).' LIMIT '.$limit;
                          $aucs $db->select($query$selectQuery[2]); 

                          Kommentar

                          Lädt...
                          X