Ergebnis 1 bis 4 von 4

Thema: SearchIndex wird trotz gleichen Content neu geschrieben

  1. #1
    Contao-Nutzer
    Registriert seit
    28.07.2012.
    Beiträge
    27

    Standard SearchIndex wird trotz gleichen Content neu geschrieben

    Nach jedem FrontendTemplate output wird addToSearchIndex aufgerufen, was wiederum indexPage aufruft.

    Darin befindet sich folgender Abschnitt:
    PHP-Code:
            $objIndex $objDatabase->prepare("SELECT id, url FROM tl_search WHERE checksum=? AND pid=?")
                                    ->
    limit(1)
                                    ->
    execute($arrSet['checksum'], $arrSet['pid']);
            
    // Update the URL if the new URL is shorter or the current URL is not canonical
            
    if ($objIndex->numRows && $objIndex->url != $arrSet['url'])
            {
                if (
    strpos($arrSet['url'], '?') === false && strpos($objIndex->url'?') !== false)
                {
                    
    // The new URL is more canonical (no query string)
                    
    $objDatabase->prepare("DELETE FROM tl_search WHERE id=?")
                                ->
    execute($objIndex->id);
                    
    $objDatabase->prepare("DELETE FROM tl_search_index WHERE pid=?")
                                ->
    execute($objIndex->id);
                }
                elseif (
    substr_count($arrSet['url'], '/') > substr_count($objIndex->url'/') || (strpos($arrSet['url'], '?') !== false && strpos($objIndex->url'?') === false) || \strlen($arrSet['url']) > \strlen($objIndex->url))
                {
                    
    // The current URL is more canonical (shorter and/or less fragments)
                    
    $arrSet['url'] = $objIndex->url;
                }
                else
                {
                    
    // The same page has been indexed under a different URL already (see #8460)
                    
    return false;
                }
            } 
    Wird dieser Zweig übersprungen, weil ein item gefunden wurde, wird der "search" Eintrag in die Datenbank geschrieben. Siehe folgenden Code:


    PHP-Code:
            $objIndex $objDatabase->prepare("SELECT id FROM tl_search WHERE url=? AND pid=?")
                                    ->
    limit(1)
                                    ->
    execute($arrSet['url'], $arrSet['pid']);
            
    // Add the page to the tl_search table
            
    if ($objIndex->numRows)
            {
                
    $objDatabase->prepare("UPDATE tl_search %s WHERE id=?")
                            ->
    set($arrSet)
                            ->
    execute($objIndex->id);
                
    $intInsertId $objIndex->id;
            }
            else
            {
                
    $objInsertStmt $objDatabase->prepare("INSERT INTO tl_search %s")
                                             ->
    set($arrSet)
                                             ->
    execute();
                
    $intInsertId $objInsertStmt->insertId;
            } 
    Danach werden auch noch die Indizes neu geschrieben.

    Dies hatte bei mir zur Folge, dass eine Datenbank Connection solange geöffnet blieb, bis die Seite neu indiziert war. Als ich die Webseite dann live schaltete, bekam ich ca. nach 15 Minuten den Fehler "Too many connections". Damit war dann auch die Seite down.

    Ich hatte mir ein logging eingebaut, was mir alle Datenbank connections und disconnections sowie alle queries dazwischen loggt. Dabei ist mir aufgefallen, dass unheimlich viele INSERTs bei jedem Seiten Aufruf stattfinden. Außerdem wurde immer wieder das gleiche in die Search Index geschrieben.

    Mein Lösungsvorschlag wäre:

    PHP-Code:
            // Update the URL if the new URL is shorter or the current URL is not canonical
            
    if ($objIndex->numRows && $objIndex->url != $arrSet['url'])
            {
                if (
    strpos($arrSet['url'], '?') === false && strpos($objIndex->url'?') !== false)
                {
                    
    // The new URL is more canonical (no query string)
                    
    $objDatabase->prepare("DELETE FROM tl_search WHERE id=?")
                                ->
    execute($objIndex->id);
                    
    $objDatabase->prepare("DELETE FROM tl_search_index WHERE pid=?")
                                ->
    execute($objIndex->id);
                }
                elseif (
    substr_count($arrSet['url'], '/') > substr_count($objIndex->url'/') || (strpos($arrSet['url'], '?') !== false && strpos($objIndex->url'?') === false) || \strlen($arrSet['url']) > \strlen($objIndex->url))
                {
                    
    // The current URL is more canonical (shorter and/or less fragments)
                    
    $arrSet['url'] = $objIndex->url;
                }
                else
                {
                    
    // The same page has been indexed under a different URL already (see #8460)
                    
    return false;
                }
            }
    // LÖSUNGSVORSCHLAG ############
            
    elseif($objIndex->numRows)
            {
                return 
    false;
            } 

    https://github.com/contao/core-bundl...earch.php#L185

    Könntet ihr dieses Verhalten bestätigen?

    Grüße und Danke!
    Geändert von Undaare (19.07.2018 um 11:30 Uhr)

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.108
    Partner-ID
    10107

    Standard

    Welche Contao Version genau?

  3. #3
    Contao-Nutzer
    Registriert seit
    28.07.2012.
    Beiträge
    27

    Standard

    Das sollte ALLE Contao Versionen betreffen.

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.108
    Partner-ID
    10107

    Standard

    Du solltest dafür einen PR machen und dort den Sachverhalt genau erklären (wie hier).

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •