Volltextsuche auf einen "Baum" begrenzen

Gesperrt
sabsab
Beiträge: 35
Registriert: Mo 21. Feb 2005, 16:10
Wohnort: München
Kontaktdaten:

Volltextsuche auf einen "Baum" begrenzen

Beitrag von sabsab »

hallo zusammen!

nutze modul "Volltextsuche mit Highlighting und UND-/ODER-Verknuepfung"

http://www.contenido.org/forum/viewtopi ... sc&start=0

habe auch hier schon meine frage gestellt, aber leider konnte mir bisher keiner helfen.
habe auf einer site verschiedene "bäume" (quasi als neue hauptnavi mit ca. 20 unterkategorien, die als eigenständige homepages agieren).
jetzt möchte ich aber nicht die ganze datenbank durchsuchen lassen, sondern nur einen bestimmten bereich, also hier einen "baum".
ist das prinzipiell möglich? wie könnte ich die suche einschränken?

habe schon mal probiert die sql-abfrage mit
AND CATART.is_start = '132' (132 für meinen fall)
in der
$whereClause = " " .
irgendwie einzubauen, allerdings ohne erfolg. das ist wohl nicht der ansatz :( :?:

hier der code des moduls

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=\"33\"/>\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 " . 
            "   a.title, " . 
            "   a.idart, " . 
            "   a.summary, " . 
            "   a.idartlang, " . 
            "   b.idcat, " . 
            "   count(*) AS ordervalue, " . 
            "   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 " . 
            "   ordervalue DESC"; 
          
      $this->db->query($sql); 
       
      $this->searchResults = array(); 
      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')); 
      } 
   } 
    
   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(); 

?>
danke und gruss
sabsab
Contenidoversion 4.6.15
mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf »

kenn mich mit der 4.4.x nicht so aus bin erst in die 4.6.x eingestiegen, da muss man ja eh im mandanten

search resultpage 'wert'
searchrange include 1 'wert(e)'

eingeben, damit könntest du nur den baum eingrenzen den du möchtest
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams
Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin »

mvf, knapp daneben ist auch vorbei. :wink: Nett, dass du helfen willst, aber 4.4 funktioniert noch ganz anders als 4.6, und erst recht das Suchmodul. :)
sabsab, versuch

Code: Alles auswählen

$sql = "" .
            "SELECT " .
            "   a.title, " .
            "   a.idart, " .
            "   a.summary, " .
            "   a.idartlang, " .
            "   b.idcat, " .
            "   count(*) AS ordervalue, " .
            "   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 "; 
durch

Code: Alles auswählen

$sql = "" .
            "SELECT " .
            "   a.title, " .
            "   a.idart, " .
            "   a.summary, " .
            "   a.idartlang, " .
            "   b.idcat, " .
            "   count(*) AS ordervalue, " .
            "   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 b.idcat = 132 " .
            "   AND a.online = 1 "; 
zu ersetzen
Zuletzt geändert von Halchteranerin am Mo 5. Dez 2005, 21:03, insgesamt 1-mal geändert.
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!
sabsab
Beiträge: 35
Registriert: Mo 21. Feb 2005, 16:10
Wohnort: München
Kontaktdaten:

Beitrag von sabsab »

hallo Halchteranerin!

vielen dank vorab, aber leider werden mir nach einbau keine suchergebnisse angezeigt.

für mich zum verständnis:
ist hier die idcat (bei mir 132) einzugeben
oder die idcatart (171)?

habe beides probiert - selbes resultat!

gruß
sabsab
Contenidoversion 4.6.15
mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf »

Halchteranerin hat geschrieben:mvf, knapp daneben ist auch vorbei. :wink: Nett, dass du helfen willst, a
tja wie gesgt nen versuch, auch al reoutr zu geben, war es wert ;)
bemühe mich auch klar zu staten, dass ich selbst nicht der Prof bon
:oops:
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams
sabsab
Beiträge: 35
Registriert: Mo 21. Feb 2005, 16:10
Wohnort: München
Kontaktdaten:

Beitrag von sabsab »

ok, wenn ich mir den code genau ansehe, dann is es wohl die idcat ...
aber problem besteht!
Contenidoversion 4.6.15
sabsab
Beiträge: 35
Registriert: Mo 21. Feb 2005, 16:10
Wohnort: München
Kontaktdaten:

Beitrag von sabsab »

hmm, wenn ich
" AND b.is_start = 1 " einsetze, wird bei mir die hauptnavigation durchsucht. soweit ok! allerdings werden keine ergebnisse des anderen "baum" angezeigt.

vielleicht steh ich auf dem schlauch:
wie ermittel ich die idcat des baumes, der durchsucht werden soll?
Contenidoversion 4.6.15
Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin »

bei is_start=1 wuerde doch nur der Startartikel durchsucht werden, das willst du nicht wirklich, oder?
sabsab hat geschrieben:wie ermittel ich die idcat des baumes, der durchsucht werden soll?
Indem du z.B. im Frontend mit der Maus ueber den entsprechenden Menuepunkt faehrst und auf die Statuszeile achtest.
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!
sabsab
Beiträge: 35
Registriert: Mo 21. Feb 2005, 16:10
Wohnort: München
Kontaktdaten:

Beitrag von sabsab »

bei is_start=1 wuerde doch nur der Startartikel durchsucht werden, das willst du nicht wirklich, oder?
nicht ganz, in diesem fall durchsucht er komischer weise den gesamten baum, der sich unter 1 befindet (in der standardinstallation ist das die hauptnavi)

ok, und das mit der idcat habe ich dann doch richtig verstanden, war mir nur nicht ganz sicher, ob das auch für einen separaten "baum" gilt.

nun komme ich aber mit is_start=132 bei mir nicht weiter, da leider keine suchergebnisse angezeigt werden.

die 132 ist der startartikel des neuen baumes. alle kategorien darunter sind größer 132.
Contenidoversion 4.6.15
Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin »

oh Mann, das naechste Mal schaue ich genauer hin! Mir ist gar nicht aufgefallen, was ich aus deinem Posting kopiert habe. :oops:
Wie gesagt, das mit is_start ist schwachsinn (und erst recht, was ich geschrieben habe, naemlich is_start=132, denn das kann nur 0 oder 1 sein. Ich aendere mal oben den Code, versuch's dann nochmal mit der neuen Version. So wird zumindest die idcat 132 durchsucht, wenigstens theoretisch. :)
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!
sabsab
Beiträge: 35
Registriert: Mo 21. Feb 2005, 16:10
Wohnort: München
Kontaktdaten:

Beitrag von sabsab »

hi, Halchteranerin!

vielen dank! funktioniert bei idcat 132, allerdings nur bei dieser, wie du richtigerweise geschrieben hast
wie kann ich es nun machen, dass alle idcats eines "baumes" durchsucht werden.

meine struktur sieht so aus:
132 (ist startartikel des neuen baumes)
-133 (kategorie)
--artikel 1
--art2
--art3
-134
--art1
...

zur besseren vorstellung:
http://reg-dich.de/stm/cms/front_content.php?idcat=132
-> noch im testlauf
Contenidoversion 4.6.15
Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin »

Also so auf die Schnelle faellt mir nur die Loesung ein, bei der du alle gewuenschten Kategorien angibst, z.B. indem du die Zeile

Code: Alles auswählen

"   AND b.idcat = 132 " . 
durch

Code: Alles auswählen

"   AND (b.idcat = 132 OR b.idcat=133 OR b.idcat=134) " . 
ersetzt, wobei du in den Klammern eben alle Kategorien nach obigem Muster angeben muesstest.
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!
sabsab
Beiträge: 35
Registriert: Mo 21. Feb 2005, 16:10
Wohnort: München
Kontaktdaten:

Beitrag von sabsab »

vielen dank, funktioniert!

ich weiss, es war auf die schnelle, aber falls du nochmal die zeit findest darüber nachzudenken wäre das klasse.
problem: beim erweitern von kategorien durch redakteure müßte leider auch der code modifiziert werden.

gibt es keine übergeordnete id eines baumes? so dass auch die darunter liegenden kategorien einbezogen werden?

dennoch, vielen dank für die schnelle und sehr gute hilfe.

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

Beitrag von Halchteranerin »

das ist der Punkt ... ich dachte, dass es evtl. rekursiv gehen koennte, aber ich glaube, das scheitert einfach daran, dass die idcats nach Reihenfolge, wie sie angelegt werden, vergeben werden, deswegen kann's mit der Suche schief gehen. Was man machen koennte, waere, im Input irgendeine Konfigurationsmoeglichkeit einzubauen, aber so viel Zeit habe ich gar nicht, weil ich das selbst auch nicht "aus dem Aermel schuetteln" kann. Vielleicht guckt sich das noch jemand anders an.
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!
Gesperrt