Hallo,
wenn im Artikelname ein Hochkomma (Apostroph) oder ähnliches vorkommt, wird dieser nicht indexiert, und kann nachher nicht gefunden werden. Das ist sehr schlecht. Besteht eine Möglichkeit, dies zu ändern?
z.B. bei: Côte d’Azur (Département Var)
Vielen Dank
Gruß
(sorry, daß ich einen neuen Thread aufgemacht hab )
Hallo,
Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.
Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.
Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Bist Du sicher das diese Artikel nicht indiziert werden? Ich meine es gab das Problem schon mal und zwar mit Umlauten. Suchbegriffe mit Umlauten lieferten keine Ergebnisse, weil sie als HTML Entities vorhanden waren, also als
Diesen Umstand muß man bei der Eingabe des Suchbegriffes und der eigentlichen Suche berücksichtigen.
Ciao, Tom
Code: Alles auswählen
ü = ü usw.
Ciao, Tom
wenn ich deine Beispiele nehme, dann kommt folgendes zu Tage
ist das berücksichtigt? Gib doch spaßeshalber mal das Suchwort mit Entities ein und schau ob Du Ergebnisse bekommst...
Ciao, Tom
Code: Alles auswählen
Côte d´Azur -> Côte d´Azur
Département -> Département
Ciao, Tom
- Markus.Staab
- Entwickler
- Beiträge: 9634
- Registriert: 29. Jan 2005, 15:50
- Wohnort: Aschaffenburg/Germany
- Kontaktdaten: ICQ Website
Hallo,TomHH hat geschrieben:wenn ich deine Beispiele nehme, dann kommt folgendes zu Tage
ist das berücksichtigt? Gib doch spaßeshalber mal das Suchwort mit Entities ein und schau ob Du Ergebnisse bekommst...Code: Alles auswählen
Côte d´Azur -> Côte d´Azur Département -> Département
Ciao, Tom
also ich habe es so eingegeben, aber es kommt trotzdem "nichts gefunden".
Aber die Artikel existieren ja, nur werden sie irgendwie nicht indexiert.
So, ich hab das jetzt mal getestet und es funktioniert sowohl die Suche von Artikelnamen mit 'Côte d´Azur' als auch Inhalt mit dem Begriff.
Der Index hat Du ja neu aufgebaut nachdem die betroffenen Inhalte eingepflegt wurden!?
Bekommst Du beim indizieren Warnings oder Fehler?
Kannst Du die Inhalte in der Tabelle (über phpMyadmin o.ä.) finden? Die Tabelle heißt irgendwas mit '*12_search_index' ...
Gruß, Tom
Der Index hat Du ja neu aufgebaut nachdem die betroffenen Inhalte eingepflegt wurden!?
Bekommst Du beim indizieren Warnings oder Fehler?
Kannst Du die Inhalte in der Tabelle (über phpMyadmin o.ä.) finden? Die Tabelle heißt irgendwas mit '*12_search_index' ...
Gruß, Tom
Hallo,
ja also ich habe einmal den Suchindex erneuert und dann nochmal die Tabelle von hand geleert und nochmals den suchindex erneuert. der betroffene artikel steht jedoch auch nicht in der datenbank drin (also in der 12_search_index). aus einem mir unerfindlichen grund wird dieser und andere mit ' nicht indexiert.
Nachtrag: Also ein Test-Eintrag hat ergeben, daß doch tatsächlich auch die fraglichen Wörter indexiert und gefunden werden. bleibt die frage, warum bestehende nicht in die suche aufgenommen werden. ne idee?
Wenn ich den Artikel genau gleich nochmal neu eingebe, also als neuer Artikel aber alles genau gleich, wird er indexiert. Also warum nicht der bestehende?
und noch was: wenn ich nur * in das suchfeld eingebe, dann kommen eine menge gleichlautender fehlermeldungen:
Warning: preg_match_all(): Compilation failed: nothing to repeat at offset 9 in ./redaxo/include/addons/search_index/classes/class.search_index.inc.php on line 220
ja also ich habe einmal den Suchindex erneuert und dann nochmal die Tabelle von hand geleert und nochmals den suchindex erneuert. der betroffene artikel steht jedoch auch nicht in der datenbank drin (also in der 12_search_index). aus einem mir unerfindlichen grund wird dieser und andere mit ' nicht indexiert.
Nachtrag: Also ein Test-Eintrag hat ergeben, daß doch tatsächlich auch die fraglichen Wörter indexiert und gefunden werden. bleibt die frage, warum bestehende nicht in die suche aufgenommen werden. ne idee?
Wenn ich den Artikel genau gleich nochmal neu eingebe, also als neuer Artikel aber alles genau gleich, wird er indexiert. Also warum nicht der bestehende?
und noch was: wenn ich nur * in das suchfeld eingebe, dann kommen eine menge gleichlautender fehlermeldungen:
Warning: preg_match_all(): Compilation failed: nothing to repeat at offset 9 in ./redaxo/include/addons/search_index/classes/class.search_index.inc.php on line 220
Offline ist er aber nicht, oder? Hängt er vielleicht direkt in der Root-Kategorie?Torment0r hat geschrieben:Hallo,
ja also ich habe einmal den Suchindex erneuert und dann nochmal die Tabelle von hand geleert und nochmals den suchindex erneuert. der betroffene artikel steht jedoch auch nicht in der datenbank drin (also in der 12_search_index). aus einem mir unerfindlichen grund wird dieser und andere mit ' nicht indexiert.
DB-Fehler?Torment0r hat geschrieben:Wenn ich den Artikel genau gleich nochmal neu eingebe, also als neuer Artikel aber alles genau gleich, wird er indexiert. Also warum nicht der bestehende?
das hängt damit zusammen, das der reguläre Ausdruck dann Bockmist ist! Schließ mal '*' als Suchbgeriff aus und guck das der Suchbegriff länger als z.B. 3 Zeichen ist. Drunter ist eine Suche eigentlich nicht sinnvoll.Torment0r hat geschrieben:und noch was: wenn ich nur * in das suchfeld eingebe, dann kommen eine menge gleichlautender fehlermeldungen:
Warning: preg_match_all(): Compilation failed: nothing to repeat at offset 9 in ./redaxo/include/addons/search_index/classes/class.search_index.inc.php on line 220
Ciao, Tom
- Thomas.Blum
- Entwickler
- Beiträge: 5063
- Registriert: 24. Aug 2004, 22:11
- Wohnort: Dresden
- Kontaktdaten: Website
Klasse! Wieder was gelernt.tbaddade hat geschrieben:Hej,
das behebt aber nicht das Problem. Er müßte dann weitere Zeichen aussschließen. Von daher sollte ein preg_quote() zuvor helfen.TomHH hat geschrieben:das hängt damit zusammen, das der reguläre Ausdruck dann Bockmist ist!
vg Thomas
Viele Grüße, Tom
Hallo,
Und wie legt man die Mindestlänge des Suchbegriffes fest?
Das Problem, daß bestimmte Artikel nicht indexiert werden habe ich leider nach wie vor. Auch der "Trick" den Artikel neu anzulegen, hat nun nicht mehr geklappt. Was könnte das Script veranlassen, die Artikel nicht zu indexieren?
Wo muß das genau hin?Von daher sollte ein preg_quote() zuvor helfen.
Und wie legt man die Mindestlänge des Suchbegriffes fest?
Das Problem, daß bestimmte Artikel nicht indexiert werden habe ich leider nach wie vor. Auch der "Trick" den Artikel neu anzulegen, hat nun nicht mehr geklappt. Was könnte das Script veranlassen, die Artikel nicht zu indexieren?
- Markus.Staab
- Entwickler
- Beiträge: 9634
- Registriert: 29. Jan 2005, 15:50
- Wohnort: Aschaffenburg/Germany
- Kontaktdaten: ICQ Website
Hallo,kills hat geschrieben:Hi,
schau dir mal den SQL an welcher zum indexieren genommen wird..
Scriptlaufzeit?
Webspace voll?
Gruß,
Markus
Das Script läuft anstandslos durch. Der Webspace ist nicht annähernd voll. Es handelt sich um einen dedizierten Server. Neue Einträge ohne Sonderzeichen werden ganz normal in die suche aufgenommen, wobei ich nicht weiß, ob die Sonderzeichen die Ursache sind. Kann es was mit der PHP Version oder der Version des MySQL zu tun haben?
- Markus.Staab
- Entwickler
- Beiträge: 9634
- Registriert: 29. Jan 2005, 15:50
- Wohnort: Aschaffenburg/Germany
- Kontaktdaten: ICQ Website
Vielleicht ist das dein Problem: ANSI_QUOTES Einstellung unter MySQL (http://dev.mysql.com/doc/refman/5.1/de/ ... yntax.html
Gruß, Tom
Gruß, Tom
PHP-Version 4.4.1
MySQL 3.23.58
@TomHH kann keine solche Einstellung finden. (Habe unter Servervariablen und -einstellungen geguckt)
Also es ist wirklich ein wenig problematisch für mich, da für meine Seite die Suche ganz elementar ist. Deswegen suche ich nach wie vor dringend eine Lösung für die vorgenannten Probleme:
1) Eingabe von * führt zu Fehlermeldungen, auch bei anderen Seiten, die hier verlinkt sind. (Habs getestet *g*) Jedoch nicht bei der von TomHH.
2) Bestimmte Artikel (mit Sonderzeichen ' ^) werden bei mir nicht indexiert, egal was ich mache.
Vielen Dank für Eure Unterstützung.
@TomHH: Könntest Du mir evtl. mal Deine such_index Datei zeigen?
Gruß
MySQL 3.23.58
@TomHH kann keine solche Einstellung finden. (Habe unter Servervariablen und -einstellungen geguckt)
Also es ist wirklich ein wenig problematisch für mich, da für meine Seite die Suche ganz elementar ist. Deswegen suche ich nach wie vor dringend eine Lösung für die vorgenannten Probleme:
1) Eingabe von * führt zu Fehlermeldungen, auch bei anderen Seiten, die hier verlinkt sind. (Habs getestet *g*) Jedoch nicht bei der von TomHH.
2) Bestimmte Artikel (mit Sonderzeichen ' ^) werden bei mir nicht indexiert, egal was ich mache.
Vielen Dank für Eure Unterstützung.
@TomHH: Könntest Du mir evtl. mal Deine such_index Datei zeigen?
Gruß
- svenalbert
- Beiträge: 1308
- Registriert: 24. Nov 2005, 17:21
- Wohnort: Clausthal-Zellerfeld / lower saxony
- Kontaktdaten: ICQ Website
Vielleicht liegt es auch daran, daß Dein Apostroph nicht als ->'<- gespeichert wurde sondern als ->’<- ( & 8217; ) oder einem ähnlichen Zeichen.
Warum wird eigentlich der Apostroph (Deinen Ausführungen nach) als Accent kodiert?
& acute; & grave; und & circ; sind nach meinem Dafürhalten eher dafür da, z.B. im französischen á, à und â zu erstellen. Nicht aber Apostrophe.
Warum wird eigentlich der Apostroph (Deinen Ausführungen nach) als Accent kodiert?
& acute; & grave; und & circ; sind nach meinem Dafürhalten eher dafür da, z.B. im französischen á, à und â zu erstellen. Nicht aber Apostrophe.
@svenalbert: Interessanter Hinweis. Offensichtlich ist z.B. bei L’Escalet im Backend ' und im Frontend ´
Könnte es damit zusammenhängen? Entstehen vielleicht 2 unterschiedliche Schreibweisen von Artikelname und Artikelinhalt?
@TomHH: Möglicherweise hast Du nirgends einen * vielleicht greift es da nicht. Andere Seiten hier weisen aber das gleiche Problem auf, deswegen vielleicht von allgemeinem Interesse. Da ich viele Artikel mit * habe, kommen eben auch viele Fehler.
Könnte es damit zusammenhängen? Entstehen vielleicht 2 unterschiedliche Schreibweisen von Artikelname und Artikelinhalt?
@TomHH: Möglicherweise hast Du nirgends einen * vielleicht greift es da nicht. Andere Seiten hier weisen aber das gleiche Problem auf, deswegen vielleicht von allgemeinem Interesse. Da ich viele Artikel mit * habe, kommen eben auch viele Fehler.
- Thomas.Blum
- Entwickler
- Beiträge: 5063
- Registriert: 24. Aug 2004, 22:11
- Wohnort: Dresden
- Kontaktdaten: Website
Hi Torment0r,
nimm mal spaßeshalber meine Klasse. Ich habe nur in Zeile 216/217 folgendes geändert
zu
Hier meine komplette Klasse:
Ciao, Tom
nimm mal spaßeshalber meine Klasse. Ich habe nur in Zeile 216/217 folgendes geändert
Code: Alles auswählen
$regex = "/\b.{0,".$this->surroundchars."}".$keywords.".{0,".$this->surroundchars."}\b/im";
Code: Alles auswählen
$regex = "#\b.{0,".$this->surroundchars."}".$keywords.".{0,".$this->surroundchars."}\b#im";
Code: Alles auswählen
<?php
/**
* Klasse zur Generation eines Suchindexes
* @package redaxo3
* @version $Id: class.search_index.inc.php,v 1.1 2006/07/21 13:53:10 kills Exp $
*/
class rex_search_index
{
var $clang = -1;
var $path = '';
var $custom_where_conditions = '';
var $status = '';
var $searchIds = false;
var $surroundchars = 64;
var $sourround_start_tag = "<b>";
var $sourround_end_tag = "</b>";
var $striptags = true;
var $debugsql = false;
function rex_indexSite()
{
global $REX;
$SQL = "SELECT id,path,clang,status,online_from,online_to,keywords,name FROM ". $REX['TABLE_PREFIX'] ."article ";
$WHERE = "";
// ----- diese artikel filtern
/*
$WHERE = " where status=1";
$artikelidfilter = array(1,2,3,4,5,6);
foreach($artikelidfilter as $val)
{
$WHERE .= " and id<>'".$val."'";
}
$articletypefilter = array(1,2,3);
foreach($articletypefilter as $val)
{
$WHERE .= " and type_id<>'".$val."'";
}
*/
if($WHERE != '')
{
$WHERE = 'WHERE '. $WHERE;
}
$LIMIT = "";
$db2 = new sql;
$db2->debugsql =& $this->debugsql;
$stop = false;
$oldstart = (int) $_REQUEST["oldstart"];
$start = (int) $_REQUEST["start"];
if ($oldstart == $start && $_REQUEST["start"] != "")
{
$stop = true;
}
if ($_REQUEST["start"])
{
$LIMIT = "LIMIT $start, 4000";
$oldstart = $start;
}
else
{
$db2->query('TRUNCATE TABLE '. $REX['TABLE_PREFIX'].$REX['TEMP_PREFIX'].'12_search_index');
}
if ($stop)
{
return "Bei der Indexgenerieung ist ein Fehler unterlaufen. Das kann an eventuell fehlerhaften Artikeln liegen.
Bei folgendem Artikel kam ein Fehler. <a href=index.php?page=content&article_id=".$_REQUEST["errorid"]."&mode=edit&clang=".$_REQUEST["errorclang"].">-> Artikel</a>";
}
else
{
$i = $start;
$articles = $db2->get_array("$SQL $WHERE $LIMIT");
$CONTENT = ob_get_contents();
ob_end_clean();
foreach ($articles as $var)
{
ob_end_clean();
ob_start();
echo "<html><head><title>REX SEARCH</title></head><body bgcolor=#fffff3>
Scriptlaufzeit war zu kurz, der Prozess wird sofort
weitergeführt. Sollten Sie dennoch abbrechen wollen dann <a href=index.php?page=search_index>hier</a>.
<br><br>
Sollte das Script sich nicht erneut aufrufen, dann <a href=index.php?page=search_index&subpage=gen_index&start=$i&oldstart=$oldstart&errorid=".$var['id']."&errorclang=".$var['clang'].">hier</a> klicken um den Prozess weiterzuführen.
<br><br><a href=index.php?page=content&article_id=".$var['id']."&mode=edit&clang=".$var['clang'].">Bei diesem Artikel wurde abgebrochen</a>
<br><br><br><br>";
$REX['GG'] = true;
$REX_ARTICLE = new article;
$REX_ARTICLE->setCLang($var['clang']);
$REX_ARTICLE->setArticleId($var['id']);
$artcache = $REX_ARTICLE->getArticle();
$db2 = new sql; // falls im artikel eine andere datnebank aufgerufen wurde
$db2->debugsql =& $this->debugsql;
$artcache = rex_register_extension_point('OUTPUT_FILTER', $artcache);
$artcache = rex_register_extension_point('SEARCH_ARTICLE_GENERATED', $artcache);
if ($this->striptags)
$artcache = preg_replace('@<[\/\!]*?[^<>]*?>@si', '', $artcache);
$sql = "INSERT INTO ". $REX['TABLE_PREFIX'].$REX['TEMP_PREFIX']. '12_search_index' ." (id,path,clang,status,online_from,online_to,name,keywords,content) VALUES ('$var[id]','$var[path]','$var[clang]','$var[status]','$var[online_from]','$var[online_to]','$var[name]','$var[keywords]','".mysql_escape_string($artcache)."')";
$db2->query($sql);
$i++;
}
ob_end_clean();
echo $CONTENT;
$REX['GG'] = false;
return "Suchindex wurde erneuert!";
}
}
function rex_search($keywords)
{
global $REX;
if (trim($keywords) == '')
return false;
$keywords = mysql_escape_string((trim($keywords)));
$suche = new sql;
$suche->debugsql =& $this->debugsql;
// ---------------------- clang check
if ($this->clang > -1)
{
$clang_set = "AND clang='".$this->clang."'";
}
else
{
$clang_set = '';
}
// ---------------------- status check
if ($this->status !== '')
{
if($this->status === true) $this->status = 1;
if($this->status === false) $this->status = 0;
$status_set = "AND status='".$this->status."'";
}
else
{
$status_set = '';
}
// ---------------------- path check
if ($this->path)
{
$path_set = "AND path LIKE ('|".$this->path."|%')";
}
else
{
$path_set = '';
}
// ---------------------- searchIds check
if ($this->searchIds)
{
$find_set = "(FIND_IN_SET('$keywords',REPLACE(id,' ',',')) * 10000000) +";
$like_set = "id = '$keywords' OR";
}
$sql = "
SELECT
(FIND_IN_SET('$keywords',REPLACE(name,' ',',')) * 10000) +
(FIND_IN_SET('$keywords',REPLACE(keywords,' ',',')) * 5) +
$find_set
(FIND_IN_SET('$keywords',REPLACE(content,' ',',')) * 5)
AS COUNTWORD, id , name , content , clang
FROM ". $REX['TABLE_PREFIX'].$REX['TEMP_PREFIX'].'12_search_index' ."
WHERE
(
name LIKE ('%$keywords%') OR
keywords LIKE ('%$keywords%') OR
$like_set
content LIKE ('%$keywords%')
)
$clang_set
$path_set
$status_set
". $this->custom_where_conditions ."
ORDER BY COUNTWORD DESC
LIMIT 0,50
";
$suche->setQuery($sql);
for ($c = 0; $c < $suche->getRows(); $c++)
{
$regex = "#\b.{0,".$this->surroundchars."}".$keywords.".{0,".$this->surroundchars."}\b#im";
$regexcontent = $suche->getValue('name').$suche->getValue('keywords').$suche->getValue('content');
preg_match_all($regex, $regexcontent, $matches = array());
$result[$c]['id'] = $suche->getValue('id');
$result[$c]['name'] = $suche->getValue('name');
$result[$c]['clang'] = $suche->getValue('clang');
if (is_array($matches[0]))
{
$result[$c]['highlightedtext'] = '';
foreach ($matches[0] as $var)
{
$result[$c]['highlightedtext'] .= "...".preg_replace("#(".$keywords.")#ims", $this->sourround_start_tag.'\\1'.$this->sourround_end_tag, $var)."... ";
break;
}
}
$suche->next();
}
return $result;
}
}
?>
- Thomas.Blum
- Entwickler
- Beiträge: 5063
- Registriert: 24. Aug 2004, 22:11
- Wohnort: Dresden
- Kontaktdaten: Website
Hej,
http://de2.php.net/manual/de/function.preg-quote.php
vg Thomas
Die Doku sollte helfenTorment0r hat geschrieben:Sorry, ich bräuchte die Auskunft einen Tick genauer. Wo und evtl. in welcher Form muß das hin?
http://de2.php.net/manual/de/function.preg-quote.php
vg Thomas