[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
Suchindex: Apostroph und Co. werden nicht indexiert - REDAXO Forum
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/
Torment0r
Beiträge: 39
Registriert: 8. Aug 2006, 17:48

Suchindex: Apostroph und Co. werden nicht indexiert

15. Jan 2007, 22:08

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 :oops: )

TomHH
Beiträge: 379
Registriert: 7. Nov 2005, 17:57
Wohnort: Hamburg

16. Jan 2007, 00:33

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

Code: Alles auswählen

ü = ü usw.
Diesen Umstand muß man bei der Eingabe des Suchbegriffes und der eigentlichen Suche berücksichtigen.

Ciao, Tom

Torment0r
Beiträge: 39
Registriert: 8. Aug 2006, 17:48

16. Jan 2007, 12:45

Hallo,

also mit den Umlauten gibt es keine Probleme, auch nicht mit * und /

Nur eben mit ' wenn das im Artikelname vorkommt.

Gruß

TomHH
Beiträge: 379
Registriert: 7. Nov 2005, 17:57
Wohnort: Hamburg

16. Jan 2007, 12:54

wenn ich deine Beispiele nehme, dann kommt folgendes zu Tage

Code: Alles auswählen

Côte d´Azur -> Côte d´Azur
Département -> Département
ist das berücksichtigt? Gib doch spaßeshalber mal das Suchwort mit Entities ein und schau ob Du Ergebnisse bekommst...

Ciao, Tom

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

16. Jan 2007, 14:20

Hi,

schonmal versucht, das suchwort mit htmlentities() zu codieren?

Gruß,
Markus

Torment0r
Beiträge: 39
Registriert: 8. Aug 2006, 17:48

16. Jan 2007, 16:53

TomHH hat geschrieben:wenn ich deine Beispiele nehme, dann kommt folgendes zu Tage

Code: Alles auswählen

Côte d´Azur -> Côte d´Azur
Département -> Département
ist das berücksichtigt? Gib doch spaßeshalber mal das Suchwort mit Entities ein und schau ob Du Ergebnisse bekommst...

Ciao, Tom
Hallo,

also ich habe es so eingegeben, aber es kommt trotzdem "nichts gefunden".
Aber die Artikel existieren ja, nur werden sie irgendwie nicht indexiert.

TomHH
Beiträge: 379
Registriert: 7. Nov 2005, 17:57
Wohnort: Hamburg

16. Jan 2007, 17:13

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

Torment0r
Beiträge: 39
Registriert: 8. Aug 2006, 17:48

16. Jan 2007, 22:06

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

TomHH
Beiträge: 379
Registriert: 7. Nov 2005, 17:57
Wohnort: Hamburg

17. Jan 2007, 01:02

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.
Offline ist er aber nicht, oder? Hängt er vielleicht direkt in der Root-Kategorie?

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?
DB-Fehler?
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
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.

Ciao, Tom

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

17. Jan 2007, 02:26

Hej,
TomHH hat geschrieben:das hängt damit zusammen, das der reguläre Ausdruck dann Bockmist ist!
das behebt aber nicht das Problem. Er müßte dann weitere Zeichen aussschließen. Von daher sollte ein preg_quote() zuvor helfen.

vg Thomas

TomHH
Beiträge: 379
Registriert: 7. Nov 2005, 17:57
Wohnort: Hamburg

17. Jan 2007, 10:25

tbaddade hat geschrieben:Hej,
TomHH hat geschrieben:das hängt damit zusammen, das der reguläre Ausdruck dann Bockmist ist!
das behebt aber nicht das Problem. Er müßte dann weitere Zeichen aussschließen. Von daher sollte ein preg_quote() zuvor helfen.

vg Thomas
Klasse! Wieder was gelernt.

Viele Grüße, Tom :)

Torment0r
Beiträge: 39
Registriert: 8. Aug 2006, 17:48

22. Jan 2007, 22:47

Hallo,
Von daher sollte ein preg_quote() zuvor helfen.
Wo muß das genau hin?

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?

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

23. Jan 2007, 08:18

Hi,

schau dir mal den SQL an welcher zum indexieren genommen wird..

Scriptlaufzeit?

Webspace voll?

Gruß,
Markus

Torment0r
Beiträge: 39
Registriert: 8. Aug 2006, 17:48

23. Jan 2007, 15:12

kills hat geschrieben:Hi,

schau dir mal den SQL an welcher zum indexieren genommen wird..

Scriptlaufzeit?

Webspace voll?

Gruß,
Markus
Hallo,

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?

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

23. Jan 2007, 17:36

Hi,

kommt drauf an was du für eine hast :)

Gruß,
Markus

TomHH
Beiträge: 379
Registriert: 7. Nov 2005, 17:57
Wohnort: Hamburg

23. Jan 2007, 17:40

Vielleicht ist das dein Problem: ANSI_QUOTES Einstellung unter MySQL (http://dev.mysql.com/doc/refman/5.1/de/ ... yntax.html

Gruß, Tom

Torment0r
Beiträge: 39
Registriert: 8. Aug 2006, 17:48

23. Jan 2007, 21:40

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ß

Benutzeravatar
svenalbert
Beiträge: 1308
Registriert: 24. Nov 2005, 17:21
Wohnort: Clausthal-Zellerfeld / lower saxony
Kontaktdaten: ICQ Website

24. Jan 2007, 17:34

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.

TomHH
Beiträge: 379
Registriert: 7. Nov 2005, 17:57
Wohnort: Hamburg

24. Jan 2007, 17:53

@Torment0r: bzgl. von '*' - ich schau mal was ich da gemacht hab und poste es dir mal.

Die Länge des Suchstring entweder per Javascript prüfen oder im Suchmodul.

Ciao, Tom

Torment0r
Beiträge: 39
Registriert: 8. Aug 2006, 17:48

24. Jan 2007, 19:20

@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.

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

25. Jan 2007, 08:55

Hej,
Torment0r hat geschrieben:Da ich viele Artikel mit * habe, kommen eben auch viele Fehler.
hast du es mit preg_quote versucht?

vg Thomas

TomHH
Beiträge: 379
Registriert: 7. Nov 2005, 17:57
Wohnort: Hamburg

25. Jan 2007, 11:52

Hi Torment0r,

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";
zu

Code: Alles auswählen

$regex = "#\b.{0,".$this->surroundchars."}".$keywords.".{0,".$this->surroundchars."}\b#im";
Hier meine komplette Klasse:

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;
  }
}
?>
Ciao, Tom

Torment0r
Beiträge: 39
Registriert: 8. Aug 2006, 17:48

25. Jan 2007, 19:38

tbaddade hat geschrieben:Hej,
Torment0r hat geschrieben:Da ich viele Artikel mit * habe, kommen eben auch viele Fehler.
hast du es mit preg_quote versucht?

vg Thomas
Sorry, ich bräuchte die Auskunft einen Tick genauer. Wo und evtl. in welcher Form muß das hin?

Danke.

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

25. Jan 2007, 21:09

Hej,
Torment0r hat geschrieben:Sorry, ich bräuchte die Auskunft einen Tick genauer. Wo und evtl. in welcher Form muß das hin?
Die Doku sollte helfen

http://de2.php.net/manual/de/function.preg-quote.php


vg Thomas

Torment0r
Beiträge: 39
Registriert: 8. Aug 2006, 17:48

25. Jan 2007, 23:07

Also ich bekomme den Fehler nicht weg. Ebenso nicht das Problem, das manche Artikel nicht indexiert werden. Trotzdem vielen Dank für Eure Hilfe und daß ihr Euch meines Problems angenommen habt.

Redaxo ist wirklich klasse.
(Nur mit der Suche haperts ein bißchen *gg*)

Gruß

Torment0r

Zurück zu „Allgemeines [R3]“