Seite 1 von 1

Suche in mehreren Text Containern

Verfasst: Mo 19. Nov 2007, 11:18
von Deddy
Hallo!

Ich habe mehrere Text Module angelegt. Nun gibt mir die Suchausgabe nur die Treffer vom ersten Text-Modul aus. Wo kann ich denn einstellen, dass in mehreren Text-Modulen gesucht werden kann?

Ich verwende diese Suchausgabe:

Code: Alles auswählen

<?php
/***********************************************
* Suchausgabe Output
*
* Author      :     Willi Man
* Copyright   :     four for business AG
* Created     :     05-04-2004
* Modified    :     12-07-2005, Andreas Lindner
************************************************/

#System properties in use:
#Type: searchrange, Name: include
#Contains comma-separated list of cats to be included into search (sub-cats are included automatically)

#Logical combination of search terms with AND or OR

#Includes
cInclude('classes', 'class.search.php');
cInclude('classes', 'class.artspec.php');
cInclude('classes', 'class.template.php');
cInclude('includes', 'functions.api.string.php');
cInclude("frontend", "includes/functions.navigation.php");
cInclude('classes', 'class.article.php');

#Initiliaze template object
if (!is_object($tpl)) {
	$tpl = new Template;
}
$tpl->reset();

#Settings
$oArticleProp = new Article_Property(& $db, & $cfg);
$iArtspecReference = 2;

$cApiClient = new cApiClient($client);
$sSearchRange = $cApiClient->getProperty('searchrange', 'include');
$aSearchRange = explode(',', $sSearchRange);

#Multilingual settings
$sYourSearchFor = mi18n("Ihre Suche nach");
$sMore = mi18n("weiter");

#Get search term and pre-process it
if (isset ($_GET['searchterm'])) {
	$searchterm = urldecode(strip_tags(htmlentities(stripslashes($_GET['searchterm']))));
}
elseif (isset ($_POST['searchterm'])) {
	$searchterm = urldecode(strip_tags(htmlentities(stripslashes($_POST['searchterm']))));
}
$searchterm = str_replace(' + ', ' AND ', $searchterm);
$searchterm = str_replace(' - ', ' NOT ', $searchterm);
$searchterm_display = $searchterm;

#Get all article specs
$sql = "SELECT
		idartspec, artspec
	FROM
		".$cfg['tab']['art_spec']."
	WHERE
		client=$client AND
		lang=$lang AND
		online=1";

$db->query($sql);
$rows = $db->num_rows();
$aArtspecOnline = array ();
$aArtSpecs = array ();
$c = 1;
$d = 1;
$e = 1;
while ($db->next_record()) {
	$aArtSpecs[] = $db->f('idartspec');
}
$aArtSpecs[] = 0;

$action = $sess->url('front_content.php');

if (strlen(trim($searchterm)) > 0) {

	#Parse search term and set search options
	$searchterm = html_entity_decode($searchterm);

	if (stristr($searchterm, ' or ') === FALSE) {
		$combine = 'and';
	} else {
		$combine = 'or';
	}
	$searchterm = str_replace(' and ', ' ', strtolower($searchterm));
	$searchterm = str_replace(' or ', ' ', strtolower($searchterm));

		$options = array ('db' => 'regexp', // use db function regexp
		'combine' => $combine, // combine searchterms with and
		'exclude' => false, // => searchrange specified in 'cat_tree', 'categories' and 'articles' is excluded, otherwise included (exclusive)
		'cat_tree' => $aSearchRange, // searchrange 
		'artspecs' => $aArtSpecs, // array of article specifications => search only articles with these artspecs
	'protected' => true); // => do not search articles or articles in categories which are offline or protected

	$search = new Search($options);

	$cms_options = array ("head", "html", "htmlhead", "htmltext", "text"); // search only in these cms-types
	$search->setCmsOptions($cms_options);

	#Execute search
	$aSearchResults = $search->searchIndex($searchterm, ''); 

	#Build results page
	if (count($aSearchResults) > 0) {
		$tpl->set('s', 'result_page', mi18n("Ergebnis-Seite").':');

		#Build meessage
		$message = $sYourSearchFor." '".htmlspecialchars(strip_tags($searchterm_display))."' ".mi18n("hat $$$ Treffer ergeben").":";
		$message = str_replace('$$$', count($aSearchResults), $message);
		$tpl->set('s', 'MESSAGE', $message);

		#Number of results per page
		$number_of_results = 10;
		$oSearchResults = new SearchResult($aSearchResults, $number_of_results);

		$num_res = $oSearchResults->getNumberOfResults() + $pdf_count;
		$num_pages = $oSearchResults->getNumberOfPages();
		$oSearchResults->setReplacement('<strong>', '</strong>'); // html-tags to emphasize the located searchterms

		#Get current result page
		if (isset ($_GET['page']) AND is_numeric($_GET['page']) AND $_GET['page'] > 0) {
			$page = $_GET['page'];
			$res_page = $oSearchResults->getSearchResultPage($page);
		} else {
			$page = 1;
			$res_page = $oSearchResults->getSearchResultPage($page);
		}

		#Build links to other result pages
		for ($i = 1; $i <= $num_pages; $i ++) {
			$nextlink = $sess->url('front_content.php?idcat='.$idcat.'&idart='.$idart.'&searchterm='.$searchterm_display.'&page='.$i.$sArtSpecs);
			if ($i == $page) {
				$nextlinks .= '<nobr>&nbsp<strong>'.$i.'</strong>&nbsp;</nobr>';
			} else {
				$nextlinks .= '<nobr>&nbsp;<a href="'.$nextlink.'" title="'.$i.'. '.mi18n("Ergebnisseite anzeigen").'">'.$i.'</a>&nbsp;</nobr>';
			}
		}
		$tpl->set('s', 'PAGES', $nextlinks);

		#Build link to next result page
		if ($page < $num_pages) {
			$n = $page +1;
			$next = $sess->url('front_content.php?idcat='.$idcat.'&idart='.$idart.'&searchterm='.$searchterm.'&page='.$n.$sArtSpecs);
			$nextpage .= '&nbsp;<a href="'.$next.'" title="'.mi18n("nächste Ergebnisseite anzeigen").'">'.mi18n("vor").' ></a>';
			$tpl->set('s', 'NEXT', $nextpage);
		} else {
			$tpl->set('s', 'NEXT', '');
		}

		#Build link to previous result page
		if ($page > 1) {
			$p = $page -1;
			//$pre = $sess->url('index-c-'.$idcat.'-'.$p.'-0.html');
			$pre = $sess->url('front_content.php?idcat='.$idcat.'&idart='.$idart.'&searchterm='.$searchterm.'&page='.$p.$sArtSpecs);
			$prevpage .= '<a href="'.$pre.'" title="'.mi18n("vorherige Ergebnisseite anzeigen").'">< '.mi18n("zurück").'</a>&nbsp;';
			$tpl->set('s', 'PREV', $prevpage);
		} else {
			$tpl->set('s', 'PREV', '');
		}

		if (count($res_page) > 0) {
			$i = 1;
			#Build single search result on result page
			foreach ($res_page as $key => $val) {
				$num = $i + (($page -1) * $number_of_results);
				$oArt = new Article($key, $client, $lang);
				#Get publishing date of article
				$pub_system = $oArt->getField('published');
				$pub_user = trim(strip_tags($oArt->getContent('HEAD', 90)));
				if ($pub_user != '') {
					$show_pub_date = "[".$pub_user."]";
				} else {
					$show_pub_date = '';
					if ($pub_system[8] != '0') {
						$show_pub_date .= $pub_system[8];
					}
					$show_pub_date .= $pub_system[9].'.';
					if ($pub_system[5] != '0') {
						$show_pub_date .= $pub_system[5];
					}
					$show_pub_date .= $pub_system[6].".".$pub_system[0].$pub_system[1].$pub_system[2].$pub_system[3]."]";
					$show_pub_date = "[".$show_pub_date;
				}
			
				#Get text and headline of current article
				$iCurrentArtSpec = $oArticleProp->getArticleSpecification($key, $lang);
				$aHeadline = $oSearchResults->getSearchContent($key, 'HTMLHEAD', 1);
				$aSubheadline = $oSearchResults->getSearchContent($key, 'HTMLHEAD', 2);
				$text = $oSearchResults->getSearchContent($key, 'HTML', 1);
				$text = capiStrTrimAfterWord($text[0], 200);
				$headline = capiStrTrimAfterWord($aHeadline[0], 200); # conflict with capiStrTrimAfterWord and setReplacement('<strong>', '</strong>')
				$subheadline = capiStrTrimAfterWord($aSubheadline[0], 200);

				$cat_id = $oSearchResults->getArtCat($key);
				$sCatName = getCategoryName($cat_id, & $db);
				$similarity = $oSearchResults->getSimilarity($key);

				ob_start();
				printf("%.0f", $similarity);
				$similarity = ob_get_contents();
				ob_end_clean();

				#Send output to template
				$href = $sess->url("front_content.php?idcat=$cat_id&idart=$key");
				$tpl->set('d', 'more', $sMore);
				$tpl->set('d', 'HREF', $href);
				$tpl->set('d', 'TITLE', mi18n("Link zu Suchergebnis").' '.$i);
				$tpl->set('d', 'NUM', $num);
				$tpl->set('d', 'CATNAME', $headline);
				$tpl->set('d', 'HEADLINE', $text);
				$tpl->set('d', 'SUBHEADLINE', $subheadline);
				$tpl->set('d', 'SIMILARITY', $similarity);
				$tpl->set('d', 'TARGET', '_self');
				$tpl->set('d', 'PUB_DATE', $show_pub_date);
				$tpl->next();
				$i ++;

			}
			$tpl->generate('templates/suchausgabe.html');
		}
	} else {
		#No results
		$tpl->set('s', 'MESSAGE', $sYourSearchFor." '".htmlspecialchars(strip_tags($searchterm))."' ".mi18n("hat leider keine Treffer ergeben").".");
		$tpl->set('s', 'NEXT', '');
		$tpl->set('s', 'PREV', '');
		$tpl->set('s', 'PAGES', '');
		$tpl->set('s', 'result_page', '');
		$tpl->generate('templates/suchausgabe.html');
	}

}

class Article_Property {
	var $globalConfig;
	var $oDBInstance;

	/**
	 * Constructor
	 * Hint: Call constructor with Article_Property(&$db, &$cfg);
	 * @param  oDBInstance instance of class DB_Contenido
	 * @param  globalConfig 
	 */
	function Article_Property($oDBInstance, $globalConfig) {
		$this->globalConfig = $globalConfig;
		$this->oDBInstance = $oDBInstance;
	}

	/**
	 * Get specification of an article
	 * 
	 * @param  	$iArticleId
	 * @return  id of article specification 
	 */
	function getArticleSpecification($iArticleId, $iLangId) {

		$sqlString = "   
			  		SELECT 
		            	artspec
		            FROM 
		            	".$this->globalConfig['tab']['art_lang']."
		            WHERE
		            	idart = '".$iArticleId."' AND
						idlang = '".$iLangId."'
		            ";

		#echo "<pre>$sqlString</pre>";
		$this->oDBInstance->query($sqlString);

		if ($this->oDBInstance->next_record()) {
			return $this->oDBInstance->f('artspec');
		} else {
			return false;
		}
	}
}
?> 
Gruss Deddy

Re: Suche in mehreren Text Containern

Verfasst: Mo 19. Nov 2007, 12:09
von wosch
Deddy hat geschrieben:Ich habe mehrere Text Module angelegt. Nun gibt mir die Suchausgabe nur die Treffer vom ersten Text-Modul aus. Wo kann ich denn einstellen, dass in mehreren Text-Modulen gesucht werden kann?
Gedankenfehler von dir.
Dieses Suchmodul durchsucht keine Text-Module einzeln und zeigt dann das Ergebnis pro Modul an.
Es durchsucht eine Seite (ohne Rücksicht auf die Anzahl der Textmodule in dieser Seite) anhand der Einträge in der MySql-Tabelle. Findet es einen Treffer zeigt es die Seite als Link an und gibt die ersten 200 Zeichen dieser Seite als Treffertext aus.

Du kannst also nicht einen Ausgabetext anhängig vom Modul, wo der Treffer vorkommt, erwarten.

Verfasst: Mo 19. Nov 2007, 13:24
von Deddy
Seltsam!? Dann frage ich mich wie dass dann möglich sein kann.
Beispiel: Auf der Startseite habe ich ein wort im 2. Text-Modul drin.
Benutze ich die Suche wird die Seite nicht angezeigt. Nehme ich das Wort
und füge es im ersten Text-Modul ein, dann wird die Seite auch in der
Suchausgabe angezeigt.

Was mich auch noch auf den Gedanken gebracht hat ist dieser Teil:
Was bedeutet dann die 1 bei der letzten Zeile

Code: Alles auswählen

				#Get text and headline of current article
				$iCurrentArtSpec = $oArticleProp->getArticleSpecification($key, $lang);
				$aHeadline = $oSearchResults->getSearchContent($key, 'HTMLHEAD', 1);
				$aSubheadline = $oSearchResults->getSearchContent($key, 'HTMLHEAD', 2);
				$text = $oSearchResults->getSearchContent($key, 'HTML', 1);
Was bedeutet die 1 hinter HTML in der letzten Zeile.

Verfasst: Mo 19. Nov 2007, 13:35
von wosch
Deddy hat geschrieben:Was mich auch noch auf den Gedanken gebracht hat ist dieser Teil:
Was bedeutet dann die 1 bei der letzten Zeile

Code: Alles auswählen

				#Get text and headline of current article
				$iCurrentArtSpec = $oArticleProp->getArticleSpecification($key, $lang);
				$aHeadline = $oSearchResults->getSearchContent($key, 'HTMLHEAD', 1);
				$aSubheadline = $oSearchResults->getSearchContent($key, 'HTMLHEAD', 2);
				$text = $oSearchResults->getSearchContent($key, 'HTML', 1);
Was bedeutet die 1 hinter HTML in der letzten Zeile.
Bevor ich jetzt probiere was passiert, kannst du es doch auch.
Ergänze doch einfach:

Code: Alles auswählen

				$text = $oSearchResults->getSearchContent($key, 'HTML', 2);
ob dann der 2. Text-Container angezeigt wird.
Das ist ja wohl dein Gedankengang.

Verfasst: Mo 19. Nov 2007, 13:52
von Deddy
jetzt habe ich mir die Zeile genauer angesehen. Scheinbar wird hier nur der Text ausgelesen, der dann in der Suchausgabe erscheint. Für die eigentliche Suchabfrage ist diese Zeile unrelevant.

Verfasst: Mo 19. Nov 2007, 15:29
von wosch
Deddy hat geschrieben:jetzt habe ich mir die Zeile genauer angesehen. Scheinbar wird hier nur der Text ausgelesen, der dann in der Suchausgabe erscheint. Für die eigentliche Suchabfrage ist diese Zeile unrelevant.
Du hattest recht.

Es wird nicht die komplette Tabelle con_content durchsucht.
Sondern nur Inhalte in dieser Tabelle die die typeid = 1 haben.

In der MySql-DB läßt sich das schön erkennen:
idartlang = ist die Identifikation des Artikels/Inhalt
idtype = 1 für Headline / 2 für Text-HTML-1
typeid = 1 für Text-HTML-1 / 2 für Text-HTML-2

Die gesamte Sucheabfrage spielt sich nicht im Modul ab sondern in der class.search.php , von dort werden die Daten an das Modul übergeben.
(Das Modul macht eigentlich nur Ausgabe, Formatierung und Seitenzähler)

Verfasst: Mo 19. Nov 2007, 16:00
von Deddy
Ich habe in meiner DB nachgesehen. Da habe ich tatsächlich typeid's bis zur Zahl 5.

Die Klasse class.search.php habe ich mir angesehen, aber das ist mir leider
zu hoch. Ich habe nur verstanden, dass automatisch eben beim Text nur die
1 genommen wird und ich das manuell verändern kann, wenn ich das richtig
verstanden habe. Aber wie mache ich das? Wäre suprig, wenn du mir da
helfen könntest. Ich bring das nicht auf die Reihe. :cry:

Verfasst: Mo 19. Nov 2007, 17:00
von wosch
Deddy hat geschrieben:Ich bring das nicht auf die Reihe. :cry:
Dann sind wir schon zu zweit :lol:
Ich erkenne zwar was da passiert, verstehe auch hin und wieder etwas was du gemacht wird, aber mehr Wissen ist bei mir auch nicht drin um da solche Änderungen zu machen.

Vielleicht liest ja noch einer der "Experten" und hilft.

Verfasst: Mi 21. Nov 2007, 08:42
von Deddy
Oh je! :(

Hoffentlich liest das wirklich einer. Ich hoffe Herr B nimmt sich Zeit. :-)
Danke nochmals Wosch! Aber das Problem haben doch bestimmt noch andere.
Oder habe ich da irgendwo einen Fehler gemacht?

Verfasst: Mi 21. Nov 2007, 09:32
von Dodger77
@Deddy:

Bitte teste mal folgendes. Nimm einen Artikel, bei dem Wörter aus einem 2. CMS_HTML nicht gefunden zu werden scheinen, und speichere die Inhalte darin nochmal. Dann such nochmal nach einem der Wörter. Sollte das dann funktionieren, wurden die Inhalte aus irgend einem Grund vorher nicht indexiert.

Verfasst: Mi 21. Nov 2007, 12:32
von Deddy
Habs versucht aber lt. Datenbank wird das Wort nach dem ich suche in den con_keywords nur einmal aufgeführt. Der Textblock wird einfach nicht indiziert. Was seltsam ist, dass in der letzten Spalte unter idlang 1 drin steht, obwohl das Wort "degazage" idlang 3 für die französische Sprache haben sollte.

Verfasst: Di 27. Nov 2007, 08:21
von Deddy
Ich habe gemerkt, dass wenn ich einen neuen Artikel anlege, dann funktioniert die Suche. Egal in welchem Text-Modul ich den Text eingebe. Ein erneutes Abspeichern der Artikel die nicht richtig indexiert worden sind bringt keine Lösung. Wie kann ich die "alten" also die Artikel, die nicht richtig indexiert worden sind, neu indexieren? Und wie kann es überhaupt dazu kommen, dass die Artikel nicht indexiert worden sind.

Verfasst: Di 27. Nov 2007, 08:42
von Dodger77
Man kann im Prinzip auch gelegentlich mal alle Artikel für eine Mandant-Sprach-Kombination indexieren lassen durch:

Code: Alles auswählen

<?php

conGenerateKeywords($client, $lang);

?>
@Deddy: Welche Contenido-Version setzt du überhaupt ein?

Verfasst: Di 27. Nov 2007, 09:51
von Deddy
Ich verwende die contenido-4.6.15. Gibt es eigentlich für die neueste Version schon das Modrewrite?

Ok - ich werds mal ausprobieren. Danke Dir! :wink: