Volltextsuche mit Highlighting und UND-/ODER-Verknuepfung

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Do 18. Aug 2005, 11:28

Hallo Ralph,

deine "Hilfsloesung" ist gar nicht mal so schlecht, danke! Damit sich die Leute nicht wundern, warum auf der Seite manchmal nun nichts hervorgehoben ist, werde ich einfach auf der Suchseite den Hinweis angeben, dass falls der Suchbegriff innerhalb der HTML-Tags vorkommt, dieser nicht hervorgehoben wird, fertig.

Gruss
Christa

delze
Beiträge: 8
Registriert: Do 18. Aug 2005, 10:31
Wohnort: NRW
Kontaktdaten:

Beitrag von delze » Do 18. Aug 2005, 11:36

Hallo nochmal Christa,
das Problem bei der Ausgabe des Textes kombiniert mit dem Ersetzen mittels regulärer Ausdrücke ist, dass er innerhalb von Attributen in den Tags den Suchtext ersetzt, was z.B. bei Sandra dann invalides HTML erzeugt. Das elimiert meine "Verbesserung", Text der z.B. zwischen <em></em> steht bleibt davon unbeeindruckt.
Das Ganze schluckt aber Performance, warten wir auf die richtigen Cracks ;)

schönen Gruß,
Ralph

sandra07
Beiträge: 93
Registriert: So 10. Apr 2005, 11:17
Wohnort: Schweiz
Kontaktdaten:

Beitrag von sandra07 » Fr 19. Aug 2005, 13:52

Hallo Ralph

Möchte mich auch noch kurz bedanken, dass du dich unser angenommen hast. Hatte schon die Hoffnung aufgegeben, dass sich jemand Christa und mir annimmt :lol:

Deine Lösung bringt mir leider nichts, weil ich die Highlights dringend brauche :cry:
Gruss
Sandra

delze
Beiträge: 8
Registriert: Do 18. Aug 2005, 10:31
Wohnort: NRW
Kontaktdaten:

Beitrag von delze » Fr 19. Aug 2005, 13:54

Hallo Sandra,
hmmm... bei mir wird weiterhin "gehighlighted", alleine die Attribute werden nich zerschossen. Rein interessehalber, zum Lernen ;), was hat denn nicht funktioniert?

schönen Gruß,
Ralph

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Fr 19. Aug 2005, 13:57

sandra07 hat geschrieben:Deine Lösung bringt mir leider nichts, weil ich die Highlights dringend brauche :cry:
Ich Doesel! Ich habe getestet, wie es aussieht, wenn der Suchbegriff in einem HTML-Tag ist, aber dass das Highlighting weg ist, war mir bis zu deiner Anmerkung nicht aufgefallen. Das war doch eines der beiden Features (neben der UND-/ODER-Verknuepfung), was ich unbedingt haben wollte, also kann ich leider Ralphs Aenderung wieder herausnehmen. Schade. :cry:

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Fr 19. Aug 2005, 13:59

Hallo Ralph,

nach Sandras Hinweis hatte ich nochmal geschaut, weil ich gestern nur die Haelfte getestet hatte (s.o.), und bei mir wird auch nichts mehr hervorgehoben. :(

Gruss
Christa

delze
Beiträge: 8
Registriert: Do 18. Aug 2005, 10:31
Wohnort: NRW
Kontaktdaten:

Beitrag von delze » Fr 19. Aug 2005, 14:02

stümmt :(
*Ärmelhochkrempel* ich schau noch mal nach...

delze
Beiträge: 8
Registriert: Do 18. Aug 2005, 10:31
Wohnort: NRW
Kontaktdaten:

Beitrag von delze » Fr 19. Aug 2005, 14:28

so...

vergesst alles, was ich bisher geschrieben habe *hüstel* und versucht diese Zeile in Text (HTML) anstatt dem originalen preg_replace-Statement:

Code: Alles auswählen

  $einlesen = preg_replace("/((<[^>]*)|$suchbegriff)/ie", '"\2"=="\1"? "\1":"<span class=\"suche\">\1</span>"', $einlesen);
Den Hinweis habe ich von http://www.php-faq.de/q/q-regexp-ersetzen.html ...

hoffentlich hilft es euch jetzt...

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Fr 19. Aug 2005, 14:52

und den Rest vom obigen Modul auch noch, oder nur einfach in "meinem" Modul die Zeile ersetzen?

sandra07
Beiträge: 93
Registriert: So 10. Apr 2005, 11:17
Wohnort: Schweiz
Kontaktdaten:

Beitrag von sandra07 » Fr 19. Aug 2005, 14:54

Hallo Ralph

Das ist ja Affenstark.... ES GEHT!!!! *JUBELLLLL*

Christa: nur die Zeile ersetzen!

Vielen Dank!!! :D
Gruss
Sandra

delze
Beiträge: 8
Registriert: Do 18. Aug 2005, 10:31
Wohnort: NRW
Kontaktdaten:

Beitrag von delze » Fr 19. Aug 2005, 14:55

so ist es am einfachsten:

Code: Alles auswählen

<?php 
/*********************************************** 
* CONTENIDO MODUL - OUTPUT 
* 
* Modulname   :      Text (HTML) 
* Author      :    Christa Tabara & i-fekt 
* Copyright   :     Christa Tabara & i-fekt 
* Created     :     2005-07-25 
* Modified    :     2005-07-27 
* Version :     1.1 (fuer Volltextsuche mit Highlighting) 
* ***********************************************/ 

if ($edit && empty($_REQUEST['edit'])) { 
  // Edit-Mode 
  echo "CMS_HTML[1]"; 
} else if (("CMS_HTML[1]" != "") && ("CMS_HTML[1]" != "&nbsp;")) { 
    $hol_das_suchwort = $_GET[suchwort]; 
         $suchbegriffe = explode(" ",$hol_das_suchwort); 
         $einlesen = "CMS_HTML[1]"; 
         foreach ($suchbegriffe as $suchbegriff) 
    { 
         if ($suchbegriff!="") 
         {$regexp = "/((<[^>]*)|$suchbegriff)/ie"; 
         $einlesen = preg_replace($regexp, '"\2"=="\1"? "\1":"<span class=\"suche\">\1</span>"', $einlesen);
         } 
         } 
        echo $einlesen; 
} 
?>
@Christa: hab mein Gefrickel noch etwas gesäubert ($regexp = ...)

es ist Deine Lösung, nur die eine Zeile ersetzt.

tobiashb
Beiträge: 3
Registriert: Di 19. Jul 2005, 14:32
Wohnort: Berlin
Kontaktdaten:

Suchergebnis nur nach Erstelldatum sortieren

Beitrag von tobiashb » Do 25. Aug 2005, 16:34

Hallo,

mangels ausreichender Kenntnis muss ich Euch fragen:

was muss ich im Such-Modul umstellen, damit das Ergebnis nach Erstelldatum sortiert von neu nach alt ausgegeben wird.

Danke für eine kleine Hilfe.
Tobias

delze
Beiträge: 8
Registriert: Do 18. Aug 2005, 10:31
Wohnort: NRW
Kontaktdaten:

Beitrag von delze » Do 25. Aug 2005, 18:50

Hi Tobias,
versuch mal...

Code: Alles auswählen

<?php

/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname   :      w3concepts.search.v1.2
* Author      :     Andreas Kummer
* Copyright   :     mumprecht & kummer w3concepts
* Created     :     2004-12-29
* Modified    :     2005-07-27
* Modified by :     Christa Tabara
* conFlakes-Teil herausgenommen
* ***********************************************/

class Search {

   function Search() {

      // Globale Variablen in Klassenkontext aufnehmen
      $this->getGlobals();

      // Übergabeparameter in Klassenkontext aufnehmen
      $this->importParameters();

      // Datenbankverbindung herstellen
      $this->db = new DB_Contenido;

      // Suchmaske ausgeben
      echo $this->getSearchMask();

      // Suche vornehmen
      if (!empty($this->post['searchEntry'])) {
         $this->doSearch();
         $this->showResults();
      }
   }

   function getGlobals() {

      global $auth;

      $this->classGlobal['auth'] = $auth;
   }

   function importParameters() {

      $this->get = array ();
      if (!empty ($_GET))
         foreach ($_GET as $key => $value) {
            $this->get[$key] = $value;
         }

      $this->post = array ();
      if (!empty ($_GET))
         foreach ($_GET as $key => $value) {
            $this->post[$key] = $value;
         }
   }

   function getSearchMask() {

      if (array_key_exists('searchEntry',$this->post)) {
         $searchEntry = $this->post['searchEntry'];
      } else {
         $searchEntry = '';
      }
      $kat = "$_GET[idcat]";
      $sucheintrag = "&$_GET[searchEntry]";
      if ("$_GET[logical]" != "")
        {
         $suchlogik = "&logical=$_GET[logical]";
        }
   $returnvalue = "  <div>
   <form method=\"get\" action=\"front_content.php?idcat=$kat"."$sucheintrag"."$suchlogik\">\n
   <div><input type=\"hidden\" name=\"idcat\" value=\"50\"/>\n<input type='hidden' name='lang' value='1'>\n<input type='hidden' name='client' value='1'></div>\n";

      $returnvalue .= "<div><input style=\"border:solid 1px #999; padding:3px;\" type=\"text\" name=\"searchEntry\" size=\"30\" value=\"$searchEntry\"/>";
      $returnvalue .= '&nbsp;<input type="submit" name="doSearch" value="Suche starten" /></div>';

      if (!empty($this->post['logical']) && $this->post['logical'] == 'or') {
         $returnvalue .= '<div style="margin-top:10px; margin-bottom:30px;"><fieldset><legend>Logische Verknüpfung der Suchbegriffe</legend><div style="margin-bottom:5px; margin-top:5px;"><input style="vertical-align:bottom;" type="radio" name="logical" value="and" />&nbsp;UND (alle Begriffe sind vorhanden)</div>';
         $returnvalue .= '<div><input style="vertical-align:bottom;" type="radio" name="logical" value="or" checked="checked" />&nbsp;ODER (ein Begriff oder mehrere sind vorhanden)</div></fieldset></div>';
      } else {
         $returnvalue .= '<div style="margin-top:10px; margin-bottom:30px;font-size: 12px;"><fieldset><legend>Logische Verknüpfung der Suchbegriffe</legend><div style="margin-bottom:5px; margin-top:5px;"><input style="vertical-align:bottom;" type="radio" name="logical" value="and" checked="checked" />&nbsp;UND (alle Begriffe sind vorhanden)</div>';
         $returnvalue .= '<div><input style="vertical-align:bottom;" type="radio" name="logical" value="or"  />&nbsp;ODER (ein Begriff oder mehrere sind vorhanden)</div></fieldset></div>';
      }

      $returnvalue .= '</form>';

      return $returnvalue;
   }

   function doSearch() {

      global $cfg, $client, $lang;

      $sql = "" .
            "SELECT " .
            "   d.value, " .          // zusätzlich 19.08.2005 delze
            "   a.title, " .
            "   a.idart, " .
            "   a.summary, " .
            "   a.idartlang, " .
            "   b.idcat, " .
            "   count(*) AS ordervalue, " .
            "   a.created, " .
            "   a.lastmodified " .
            "FROM {$cfg['tab']['art_lang']} AS a " .
            "LEFT JOIN {$cfg['tab']['cat_art']} AS b ON a.idart = b.idart " .
            "LEFT JOIN {$cfg['tab']['cat']} AS c ON b.idcat = c.idcat " .
            "LEFT JOIN {$cfg['tab']['content']} AS d ON a.idartlang = d.idartlang " .
            "WHERE " .
            "   c.idclient = $client " .
            "   AND a.idlang = $lang " .
            "   AND a.online = 1 ";

      $searchString = str_replace('*','.*',trim(strtolower($this->post['searchEntry'])));

      if ($this->post['logical'] == 'or') {
         // Suchbegriffe sind logisch ODER-verknüpft
         $regExpression = "(".str_replace(" ", ")|(", $searchString).")";

         $s = ereg_replace("ü", "%FC", $regExpression);
         $s = ereg_replace("ä", "%E4", $s);
         $s = ereg_replace("ö", "%F6", $s);

         $regExpression .= " | $s";

         $whereClause = " " .
               "AND (" .
               "   d.value REGEXP '{$regExpression}' " .
               "   OR a.title REGEXP '{$regExpression}' " .
               "   OR a.summary REGEXP '{$regExpression}' " .
               "   OR d.value REGEXP '{$s}' " .
               "   OR a.title REGEXP '{$s}' " .
               "   OR a.summary REGEXP '{$s}' " .
               "   ) ";

      } else {
         // Suchbegriffe sind logisch UND-verknüpft
         $searchStrings = explode(' ',$searchString);

         $whereClause = '';

         foreach ($searchStrings as $search) {
            $regExpression = "($search)";

            $s = ereg_replace("ü", "%FC", $regExpression);
            $s = ereg_replace("ä", "%E4", $s);
            $s = ereg_replace("ö", "%F6", $s);

            // $regExpression .= " | $s";

            $whereClause .= " " .
                  "AND (" .
                  "   d.value REGEXP '{$regExpression}' " .
                  "   OR a.title REGEXP '{$regExpression}' " .
                  "   OR a.summary REGEXP '{$regExpression}' " .
                  "   OR d.value REGEXP '{$s}' " .
                  "   OR a.title REGEXP '{$s}' " .
                  "   OR a.summary REGEXP '{$s}' " .
                  "   ) ";
         }
      }

      $sql = $sql.$whereClause;

      $sql = $sql." " .
            "GROUP BY " .
            "   a.title, " .
            "   a.idart, " .
            "   a.summary, " .
            "   a.idartlang, " .
            "   b.idcat, " .
            "   a.lastmodified " .
            "ORDER BY " .
            "   created DESC";

      $this->db->query($sql);
      $this->searchResults = array();

// Modifikation delze
// diese drei Zeilen ersetzen:
//      while ($this->db->next_record()) {
//         $this->searchResults[$this->db->f('idartlang')] = array('idart'=>$this->db->f('idart'),'idcat'=>$this->db->f('idcat'),'title'=>$this->db->f('title'),'summary'=>$this->db->f('summary'),'lastmodified'=>$this->db->f('lastmodified'));
//      }
// mit:

      while ($this->db->next_record()) {
         $uebernehmen = true;
         foreach ($searchStrings as $search) {

            if ($search!="") {
               // als Inhalt gelten Titel, Zusammenfassung UND Inhalt!
               $inhalt = urldecode($this->db->f('value')) . " " . urldecode($this->db->f('title')) . " " . urldecode($this->db->f('summary'));
               $inhaltbackup = $inhalt;
               $regexp = "/((<[^>]*)|$search)/ie";
               $inhalt = preg_replace($regexp, '"\2"=="\1"? "\1":""', $inhalt);

               if ($inhalt == $inhaltbackup) {
                 // der Text ist vorher UND nachher gleich, daher muß der Suchtext in einem Attribut versteckt gewesen sein
                 $uebernehmen = false;
               }
            }
         }

         if ($uebernehmen) {
            // nur wenn der Suchstring nicht in den Attributen ist, wird der Datensatz auch als gültiges Sucherergebnis ins
            // Ergebnis-Array übernommen
            $this->searchResults[$this->db->f('idartlang')] = array('idart'=>$this->db->f('idart'),'idcat'=>$this->db->f('idcat'),'title'=>$this->db->f('title'),'summary'=>$this->db->f('summary'),'lastmodified'=>$this->db->f('lastmodified'));
         }
      }
      
// Ende Modifikation delze
      
   }

   function showResults() {

      global $sess, $cfgClient, $client, $lang;

      // Ausgabe der Suchresultate
      if (!empty($this->searchResults)) {
         // Ausgabe der Resultate
         $counter = 0;
         foreach ($this->searchResults as $result) {
            $counter++;
        $suchwort = $this->post['searchEntry'];
            $link = $link = $sess->url($cfgClient[$client]['path']['htmlpath']."front_content.php?client=$client&lang=$lang&idcat={$result['idcat']}&idart={$result['idart']}&suchwort=$suchwort");
            echo '<div style="margin-bottom:15px;">';
            echo "<div style=\"margin-bottom:5px;font-size: 12px;\"><a href=\"$link\"><span style=\"font-weight:bold;\">{$result['title']}</span></a></div>";
            echo "<div style=\"margin-bottom:5px;font-size: 12px;\">{$result['summary']}</div>";
            echo "<div style=\"font-size: 10px;\">Letztmals aktualisiert: {$result['lastmodified']}</div>";
            echo '</div>';
         }
      } else {
         // Ausgabe der Meldung, dass keine Seiten gefunden worden sind.
         echo '<div style="font-size: 12px;">Die Suche ergab keine Resultate. Versuchen Sie es bitte mit anderen Suchbegriffen.</div>';
      }
   }
}

$Search = new Search();

?>
Gruß,
Ralph

Simone
Beiträge: 193
Registriert: Fr 9. Sep 2005, 06:39
Kontaktdaten:

Eine Frage noch

Beitrag von Simone » Do 15. Sep 2005, 08:38

Hallo Halchteranerin,

ich habe Dein Modul angelegt und ein neues Template und Layout gemacht. Ich habe im Layout einfach CMS_CONTAINER [Nr] eingeben und die Suche erscheint auch sehr schön. Dann habe ich das OUTPUT in den anderen Modulen geändert.

Aber leider funktioniert die Suche nicht. Gebe ich einen Suchbegriff ein, dann erscheint die Startseite.

Du schreibst unter Deinem Quellcode:
Zitat:
<div><input type=\"hidden\" name=\"idcat\" value=\"33\"/>\n<input type='hidden' name='lang' value='1'>\n<input type='hidden' name='client' value='1'></div>\n";

Sorry, wo muß ich das einsetzen?

Muß ich ein zweites Layout mit Formular erstellen? Der Text steht ja in Deinem Quellcode bereits drin.

Oder brauche ich dafür eine neue Datenbank? Du schreibst im Quellcode
// Datenbankverbindung herstellen
$this->db = new DB_Contenido;

Oder muß ich da den Namen meiner Datenbank eingeben?

Sorry, sieht im Moment so aus, als würde ich nur von Dir profitieren. Aber ich denke, nach einer Einarbeitungszeit kann ich es zurückgeben, irgendwann mal. Bin erst vor zwei Wochen auf php-cms umgestiegen, habe bisher schön fleißig html getippt und nun Lunte gerochen.

Gruß Simone

Simone
Beiträge: 193
Registriert: Fr 9. Sep 2005, 06:39
Kontaktdaten:

Beitrag von Simone » Do 15. Sep 2005, 09:32

Hallo Halchteranerin,

ich denke ja mit und gebe nicht so schnell auf :oops:

Also, für alle Dummies, die wie ich gerade anfangen.
Was meint Halchteranerin mit
<div><input type=\"hidden\" name=\"idcat\" value=\"33\"/>\n<input type='hidden' name='lang' value='1'>\n<input type='hidden' name='client' value='1'></div>

?

Der Text steht im Output des Volltextsuch-Moduls.

Wenn man (frau) Module, Layout, Templates und zum Schluß die Kategorie und einen Artikel angelegt hat, dann bekommt der Artikel eine Nummer. Im Fall von Halchteranerin hatte der Artikel die id-Nummer 33. In meinem Fall war es eine andere Nummer, deren Zusammenhang ich nach einigen Gehirnverrenkungen erschlossen und eingegeben habe und siehe da, die Suche funktioniert.

Ich hoffe, daß ich mit meinem Beitrag die Erfahrenen jetzt nicht beleidigt habe und anderen Anfänger vielleicht mal damit helfe.

Gesperrt