Volltextsuche mit Highlighting und UND-/ODER-Verknuepfung
-
- Beiträge: 5478
- Registriert: Di 2. Mär 2004, 21:11
- Wohnort: Halchter, wo sonst? ;-)
- Kontaktdaten:
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
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
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
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
-
- Beiträge: 5478
- Registriert: Di 2. Mär 2004, 21:11
- Wohnort: Halchter, wo sonst? ;-)
- Kontaktdaten:
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.sandra07 hat geschrieben:Deine Lösung bringt mir leider nichts, weil ich die Highlights dringend brauche
-
- Beiträge: 5478
- Registriert: Di 2. Mär 2004, 21:11
- Wohnort: Halchter, wo sonst? ;-)
- Kontaktdaten:
so...
vergesst alles, was ich bisher geschrieben habe *hüstel* und versucht diese Zeile in Text (HTML) anstatt dem originalen preg_replace-Statement:
Den Hinweis habe ich von http://www.php-faq.de/q/q-regexp-ersetzen.html ...
hoffentlich hilft es euch jetzt...
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);
hoffentlich hilft es euch jetzt...
-
- Beiträge: 5478
- Registriert: Di 2. Mär 2004, 21:11
- Wohnort: Halchter, wo sonst? ;-)
- Kontaktdaten:
so ist es am einfachsten:
@Christa: hab mein Gefrickel noch etwas gesäubert ($regexp = ...)
es ist Deine Lösung, nur die eine Zeile ersetzt.
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]" != " ")) {
$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;
}
?>
es ist Deine Lösung, nur die eine Zeile ersetzt.
Suchergebnis nur nach Erstelldatum sortieren
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
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
Hi Tobias,
versuch mal...
Gruß,
Ralph
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 .= ' <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" /> UND (alle Begriffe sind vorhanden)</div>';
$returnvalue .= '<div><input style="vertical-align:bottom;" type="radio" name="logical" value="or" checked="checked" /> 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" /> UND (alle Begriffe sind vorhanden)</div>';
$returnvalue .= '<div><input style="vertical-align:bottom;" type="radio" name="logical" value="or" /> 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();
?>
Ralph
Eine Frage noch
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
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
Hallo Halchteranerin,
ich denke ja mit und gebe nicht so schnell auf
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.
ich denke ja mit und gebe nicht so schnell auf
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.