Ankündigung

Einklappen
Keine Ankündigung bisher.

Suchergebnisse formatieren

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Jay84
    hat ein Thema erstellt Suchergebnisse formatieren.

    Suchergebnisse formatieren

    Hallo Leute,

    ich bin neu hier im Forum. Bisher bin ich immer gut mit Google & Co gefahren und konnte alle meine Problemstellungen schnell lösen. Auf mein folgendes Problem habe ich keine Antwort gefunden, daher habe ich mich hier angemeldet, in der Hoffnung ihr könnt mir helfen.

    Ich habe ein eigenes CMS geschrieben, das genau auf unsere Kunden ausgerichtet ist. Natürlich darf in so einem CMS eine Suchfunktion nicht fehlen. Suchfunktion etc. funktioniert auch soweit. Was mir Kopfzerbrechen bereitet, ist die Darstellung des Suchergebniss-Strings.

    Die Suchbegriffe im Ergebnis werden mit preg_replace gehighlighted, nachdem den Ergebnistext sinnvoll gekürzt wird.
    Das funktioniert mit einem Suchbegriff auch wunderbar:

    PHP-Code:
    $resultText substr($pageContentstripos($pageContent$searchstr)-70140 strlen($searchstr));
    $resultText preg_replace("/($searchstr)/i""<span class='searchResultHighlight'>$1</span>"$resultText); 
    Hier wird also vor und nach dem Suchergebnis 70 Zeichen Fleisch dazu gegeben.


    Jetzt mein Problem:
    Wenn in der Suche mehrere Suchbegriffe angegeben werden, die mit UND verknüpft sind, sollen ja auch mehrere Suchergebnisse angezeigt werden. Ich bringe die Suchbegriffe in einen Array. Sie so preg_replace zu übergeben funktioniert ja auch wunderbar. Nur wie kriege ich meinen Text sinnvoll so gekürzt, dass gerade die gefundenen Begriffe angezeigt werden, sich aber nichts doppelt und auch nur jeder Begriff mindestens einmal vorkommt?

    Ich habe es so versucht:
    ($arr ist der Array mit den Suchergebnissen, $arr_preg enthält die Pre- und Suffixe für die Preg-Funktion)
    PHP-Code:
    $resultText "";
    for(
    $s 0$s sizeof($arr); $s++) {
    $resultText.= substr($pageContentstripos($pageContent$arr[$s])-70140) . " ... ";
    }
    $resultText preg_replace($arr_preg"<span class='searchResultHighlight'>$1</span>"$resultText); 
    Hier wird immer das erste Vorkommen des Begriffs im Text gesucht und davor und dahinter 70 Zeichen Fleisch mitgegeben. Das ganze kommt in eine Variable, die am Ende angezeigt wird.
    Das funktioniert, wenn die Suchbegriffe im Text weit genug auseinander liegen.
    Suche ich aber z.B. "Franz und Taxi" im Text "Franz jagt im vollkommen verwahrlosten Taxi quer durch Berlin." wäre das Ergebnis: "Franz jagt im vollkommen verwahrlosten Taxi quer durch Berlin. ... Franz jagt im vollkommen verwahrlosten Taxi quer durch Berlin.", weil erst Franz gefunden wird, und dann Taxi und jeweils 70 Zeichen davo und dahinter mitgenommen und das Ganze hintereinander gesetzt wird.

    Ich hoffe ihr versteht mein Problem.


    Kurz und knapp also nochmal die Frage:
    Wie kürze ich einen Text sinnvoll, sodass bestimmte Begriffe mindestens einmal bestehen bleiben und der Sinnzusammenhang mit dem Begriff jeweils erhalten bleibt? (Eigentlich wie bei Google).

    Ich würde mich über eure Hilfe sehr freuen!

    Danke & Grüße,
    Jay

  • Jay84
    antwortet
    Das sieht doch schon mal sehr gut aus! Danke Leute, ich probiert das mal aus. Wenn ich mich nicht mehr melde, hat's geklappt )

    Einen Kommentar schreiben:


  • fireweasel
    antwortet
    Zitat von Jay84 Beitrag anzeigen
    ...
    Sagen wir wir haben (in einem einfachen Beispiel) die Intervalle 5-10, 7-12, 25-30 und 3-8. Dann bräuchte ich als Antwort 3-12 und 25-30.
    Gibt's da nen schlauen Weg?
    Endlich mal ein praxisnahes Problem, wo mir die Anwendung von array_reduce() sinnvoll erscheint:

    PHP-Code:
    $offsets = array (
        array (
    510),
        array (
    712),
        array (
    2530),
        array (
    38),
    );

    // nach dem Start-Offset sortieren
    usort(
        
    $offsets,
        function(
    $a$b) {
            return 
    $a[0] - $b[0];
        }
    );

    // Ueberlappungen "ausfiltern"

    $fold array_reduce(
        
    $offsets,
        function(
    $accu$item) {
            
    $before end($accu);
            if (
    $item[0] <= $before[1]) {
                if (
    $item[1] > $accu[key($accu)][1]) {
                    
    $accu[key($accu)][1] = $item[1];
                }
            }
            else {
                
    $accu[] = $item;
            }
            return 
    $accu;
        },
        array ()
    );

    var_dump($fold); 

    Einen Kommentar schreiben:


  • ChrisB
    antwortet
    Da würde ich, bevor ich mir das selber überlege, erst mal schauen, wie das andere vielleicht schon umgesetzt haben - Überlappungen in Intervallen zu finden, ist ja bestimmt eine Problematik, mit der sich auch andere schon beschäftigt haben.

    http://www.google.com/search?q=joini...+intervals+php
    Die Suchabfrage zu modifizieren, um ggf. bessere/spezifischer zum Problem passende Ansätze zu finden, bleibt erst mal dem interessierten Mitleser überlassen

    Einen Kommentar schreiben:


  • Jay84
    antwortet
    Hi ChrisB,

    danke für deine Antwort.
    Das ist denke ich schon mal ein guter Ansatz. Allerdings habe ich jetzt ein bisschen hin und her überlegt, wie man das praktikabel umsetzen könnte, damit die Auswertung nicht zu lange dauert.
    Ohne komplexe Gebilde mit Arrays die die Intervalle speichern und mit Schleifen durchsucht werden, wüsste ich keinen Weg - und selbst da habe ich nur eine vage Vorstellung...

    Sagen wir wir haben (in einem einfachen Beispiel) die Intervalle 5-10, 7-12, 25-30 und 3-8. Dann bräuchte ich als Antwort 3-12 und 25-30.
    Gibt's da nen schlauen Weg?

    Wie würdest du denn deine Idee phptechnisch Umsetzen?

    Danke & viele Grüße,
    Jay

    Einen Kommentar schreiben:


  • ChrisB
    antwortet
    Also erst mal würde ich mir die Positionen der einzelnen Begriffe im Text heraussuchen, und die entsprechenden „Intervalle“ berechnen (+/- 70 Zeichen „Fleisch“).

    Dann schauen, wo sich diese Intervalle ggf. überlappen.
    Wenn der Suchtreffer „foo“ inkl. seinem „Fleisch“ von 37 - 180 geht, und „bar“ von 72 - 215 - dann überlappen sich diese beiden Bereiche, und sind zu einem Bereich von 37 - 215 zusammen zu ziehen.

    Das funktioniert so natürlich nur auf reinem Textinhalt.
    Wenn es sich um Daten innerhalb von HTML-Code handelt, wäre das ganze sehr viel komplexer.

    Einen Kommentar schreiben:


  • cycap
    antwortet
    dein "Problem" hat ja wenig mit PHP zu tun, mehr mit Logik und Softwaredesign, von daher verschiebe ich das mal. Wäre aber schön wenn du noch nen sinnvollen Titel vergeben würdest

    [MOD] *verschoben*

    Einen Kommentar schreiben:

Lädt...
X