Frage zur Suchfunktion

Gesperrt
acid
Beiträge: 20
Registriert: Mo 28. Aug 2006, 11:31
Kontaktdaten:

Frage zur Suchfunktion

Beitrag von acid »

Hoi,

ich hab mir das Standard-Suchausgabe-Modul so "umgeschrieben", dass ich es als Livesuche verwenden kann. Das ganze funktioniert auch wunderbar, die Ergebnisse, die zurückgeliefert werden sind die selben, die auch das normale Suchmodul ausgibt. So weit so gut, allerdings gibt es das Problem, dass Suchbegriffe, die eigentlich meiner Meinung nach Ergebnisse zurückliefern sollten, dies nicht tun. Zum Beispiel habe ich einen Testartikel angelegt. Dieser Artikel besteht aus folgenden Bereichen

1x Headline
2x Content

Der Inhalt der Headline:
About us

Der Inhalt des ersten Contentbereichs:
BLI BLA BLUBBERFISCH IST DA :) (unformatiert, ohne HTML)

Der Inhalt des weiten Contentbereichs:
der große böse bliblablubberfisch treibt sich auf dieser Internetseite herum.

Der Artikel ist scheinbar richtig indiziert, in der Suche taucht er jedenfalls auf, wenn ich als Suchbegriff z.B. About-Us angebe, wird die Seite korrekt in den Ergebnissen angezeigt. Das selbe gilt, wenn ich folgendes eingebe:

"bli bla",
"blib bla b",
"bli bla bl"

Bei einer Suche nach
"blib bla blu" bekomme ich allerdings keine Ergebnisse angezeigt, obwohl das eins zu eins der String aus dem Text ist.

Das selbe Phänomen tritt auf, wenn ich einen String aus dem zweiten HTML-Container suche:

"blabl" (Teil von bliblablubberfisch) gibt nichts zurück
"bberf" (Ebenfalls Teil von bliblablubberfisch) gibt den Artikel zurück.

Ich wüsste gerne, wie dieses Verhalten zustande kommt, denke nicht das das mein Fehler ist (ich hoffe jedenfalls nicht!) :)

Anbei nochmal die Konfiguration:

Das Ausgabe-Modul wird einfach als Artikel mit einem eigenen (ansonsten leeren) Template erstellt und in einer beliebigen Kategorie abgelegt. Die Artikel-Id wird von der Ajax-Suche als Action-URL benutzt. Der Code sieht folgendermaßen aus (ist noch in der Überarbeitungsphase):

Code: Alles auswählen

<?
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');

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

// Get the search term
if (isset ($_POST['search_string'])) $searchterm = urldecode(strip_tags(htmlentities(stripslashes($_POST['search_string']))));

#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');

// Do the search
if (strlen(trim($searchterm)) > 0) {

	$searchterm = html_entity_decode($searchterm);
	
	$options = array (	'db'		=>		'regexp',		// use db function regexp
						'combine'	=>		'and', // 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);

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

	// We need our ul-Wrapper for prototype to work
	echo '<ul>';
	
	// Now we build our list
	if (count($aSearchResults) > 0) {
	
		// Get number of results
		$oSearchResults = new SearchResult($aSearchResults, $number_of_results);
		$num_res = $oSearchResults->getNumberOfResults();
		$num_pages = $oSearchResults->getNumberOfPages();
		
		$res_page = $oSearchResults->getSearchResultPage(1);
		
		foreach ($res_page as $key => $val) {
		
			// Read the article Results
			$oArt = new Article($key, $client, $lang);
			$aHeadline = $oSearchResults->getSearchContent($key, 'HTMLHEAD', 1);
			$headline = capiStrTrimAfterWord($aHeadline[0], 200); # conflict with capiStrTrimAfterWord and setReplacement('<strong>', '</strong>')
			$cat_id = $oSearchResults->getArtCat($key);
			
			echo '<li><a href="front_content.php?idcat=' . $cat_id . '&idart=' . $key . '" title="' . $headline . '">' . $headline . '</a></li>';
		
		}
		
	} else {
	
		echo '<li>Ihre Suche nach "' . $searchterm . '" hat keine Ergebnisse geliefert.</li>';
	
	}
	
	echo '</ul>';	
	

}

?>
Der Code im Suchinput:

Code: Alles auswählen

<form action="front_content.php?idcat=1&idart=4" method="post" id="search">
<fieldset>
<input type="text" name="searchterm" value="Suchen" tabindex="1" onclick="javascript:emptyElement(this, 'Suchen')" id="livesearch_button" />
<span id="livesearch_indicator" style="display: none;"><img src="upload/layout/indicator.gif" alt="Searching" /></span>
</fieldset>
</form>

<div id="livesearch_results" class="livesearch_results"></div>

<script type="text/javascript">
new Ajax.Autocompleter("livesearch_button", "livesearch_results", "front_content.php?idart=5", {paramName: "search_string", indicator: "livesearch_indicator", minChars: 3});
</script>
Wäre nett, wenn mir jemand erklären könnte, warum es zu diesen seltsamen "Aussetzern" in der Suche kommt...
Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 »

Getreu dem Motto "It's not a bug, it's a feature" ist das anscheinend das gewünschte Verhalten. Probier doch mal, was passiert, wenn du:

Code: Alles auswählen

   $options = array (   'db'      =>      'regexp',      // use db function regexp 
in

Code: Alles auswählen

   $options = array (   'db'      =>      'like',      // use db function like 
änderst.
Zuletzt geändert von Dodger77 am Sa 8. Dez 2007, 15:25, insgesamt 1-mal geändert.
acid
Beiträge: 20
Registriert: Mo 28. Aug 2006, 11:31
Kontaktdaten:

Beitrag von acid »

Hoi,

danke für die schnelle Antwort. Leider hat sich das Verhalten der Seite scheinbar nicht geändert, eine Suche nach "bli bla bl" oder "bli bla blu" gibt nichts zurück, eine Suche nach "bli bla b" oder "bli bla blu" schon....
bweichel
Beiträge: 223
Registriert: Mo 24. Jul 2006, 22:29
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von bweichel »

hi, hast du mitlerweile eine lösung für? ich habe das gleiche problem. es scheint als sucht die suche nach keywords (wortstämmen) und wenn es welche findet, werden dei ergebnisse gelistet. ich habe mir mal das array von searchIndex ausgeben lassen... darin ist ein schlüssel das keyword...

wäre wirklich gut wenn uns jemand helfen könnte... das feature nervt nämlich ohne ende...

danke!
acid
Beiträge: 20
Registriert: Mo 28. Aug 2006, 11:31
Kontaktdaten:

Beitrag von acid »

Hoi,

leider hab ich noch keine Lösung für das Problem gefunden. Wär schön wenn sich das ganze mal jemand anschauen könnte der Ahnung von Contenido hat :)
bweichel
Beiträge: 223
Registriert: Mo 24. Jul 2006, 22:29
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von bweichel »

hi ich habe eine lösung... bist du bereit?

vorab... diese suche sucht auch in der datenbank für die keywords und stellt einen vergleich zwischen keyword und suchwort her. standard ist in der class.search.php 50%. alles was darunter ist wird nicht angezeigt.

am besten gehst du hin und setzt den wert wie ich auf 0%. dann werden alle suchanfragen durchgelassen. egal wie ähnlich sie einem keyword auf der artikeldatenbank sind.

die änderung ist sehr einfach...
1. geh in das modul "suchausgabe" und suche dort nach: $aSearchResults = $search->searchIndex($searchterm, '');
2. setze davor folgendes ein: $search->intMinimumSimilarity = 0;

bei mir geht es... sag mir wie es bei dir funktioniert...
acid
Beiträge: 20
Registriert: Mo 28. Aug 2006, 11:31
Kontaktdaten:

Beitrag von acid »

Danke für den Tipp, werds ausprobieren sobald ich wieder Zeit hab an dem Projekt zu arbeiten!
acid
Beiträge: 20
Registriert: Mo 28. Aug 2006, 11:31
Kontaktdaten:

Beitrag von acid »

Vielen Dank, das hats wirklich gebracht. Hätte mir die Klasse doch wohl mal anschauen sollen :(...
derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Beitrag von derSteffen »

Hallo,

ich würde das auch gerne ausprobieren.

Weiß jemand auf welches Ajax-Framework zurückgegriffen worde, bzw. möchte jemand mal das komplette Modul (mit allen Daten und Beschriebung) veröffentlichen? Das wäre fein.

MfG Steffen
derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Beitrag von derSteffen »

Ah,

wahrscheinlich wurde das hier genommen: Ajax.Autocompleter
http://github.com/madrobby/scriptaculou ... ocompleter

Mich würde aber brennend interessieren, wie ich das schaffe die Daten aus der DB zu lesen?

MfG
acid
Beiträge: 20
Registriert: Mo 28. Aug 2006, 11:31
Kontaktdaten:

Beitrag von acid »

Im Prinzip ist das oben gepostete schon alles. Was bei Code im Suchinput steht kannst du als Modulausgabe in ein Template übernehmen.

Die Suchergebnis-Seite ist der obere Codeblock in meinem ersten Posting, einfach in ein Modul als Ausgabe reinpacken. Dann machst du dir ein neues Template mit folgendem Inhalt:

Ich habe dem Suchoutput-Modul den Namen "Template Suche - Ajax" gegeben

Code: Alles auswählen

<container id="10" name="Livesuche" content="content" default="Template Suche - Ajax">Livesuche</container>
Als letztes musst du noch die Libraries scriptacolous und prototype.js in den Header deines Templates einbinden und die Ergebnisliste mit CSS stylen.

Das wars dann auch schon.

Wenn ich meine neue Website online habe, werd ich das Modul gerne veröffentlichen, muß da aber noch ein bisschen was dran machen bevor es soweit ist.
derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Beitrag von derSteffen »

Ah ja,

habe es mir auch schon so rausgetüftelt, aber weißt du woran ich gerade verzweifle und das schon den ganzen Tag! Das Problem mit Umlaute! Sobald Umlaute mit ins Spiel kommen wird unter der Suchbox das ä ein kryptisches Zeichen. Leider kann ich meine Sprache im Mandanten nicht auf UTF-8 stellen, da dann natürlich alle anderen Umlaute so sch.. aussehen. Ganz zu Schweigen davon würde ich Probleme im Backend von Contenido bekommen, wie auch schon öfters erwähnt. So nun habe ich mehrmals gelesen, dass ich einen Header mitschicken soll. Also habe ich

Code: Alles auswählen

header('Content-Type: text/html; charset=ISO-8859-1') 
in das Modul am Anfang gepackt, welches die Liste für die Ajax-Suche ausgibt. Und es klappt teilweise. Jetzt wir mir das ä wunderbar angezeigt, aber es werden trotzdem keine Suchergebnisse gefunden, obwohl dieses Wort im Text ist. Gebe ich das suchwort mit ae ein, wird es auch gefunden.

Klicke ich auch auf meine Lupe neben der Suchbox werden mir die Ergebnisse auch richtig angezeigt. Also irgendetwas klappt bei der Ausgabe nicht, bzw. bei der Abfrage nicht. Liegt es vielleicht an den POST-Befehl, wäre GET eventuell besser?

MfG Steffen
derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Beitrag von derSteffen »

Yeahhhh,

ich habs!!!!!

Ganz einfach, also ohne header senden, ohne JavaScript ein charset=utf-8 verpassen, sondern einfach nur nach:

Code: Alles auswählen

// Do the search
if (strlen(trim($searchterm)) > 0) {

   $searchterm = html_entity_decode($searchterm);
folgendes einfügen:

Code: Alles auswählen

$searchterm = utf8_decode($searchterm);
Oh man, das war eine Geburt!!!

Trotzdem würde mich dann dein fertiges Modul interessieren!

MfG Steffen
Gesperrt