Commit 46bf17e1 authored by Karl's avatar Karl
Browse files

Mehr Kommentare

parent 5cb1fcc7
...@@ -2,9 +2,31 @@ ...@@ -2,9 +2,31 @@
namespace App\Models; namespace App\Models;
/* Die Klasse Result sammelt alle Informationen über ein einzelnes Suchergebnis.
* Die Results werden von den Suchmaschinenspezifischen Parser-Skripten erstellt.
*/
class Result class Result
{ {
public $provider; # Die Engine von der das Suchergebnis kommt
public $titel; # Der Groß Angezeigte Name für das Suchergebnis
public $link; # Der Link auf die Ergebnisseite
public $anzeigeLink; # Der tatsächlich angezeigte Link (rein optisch)
public $descr; # Die Beschreibung des Suchergebnisses
public $gefVon; # Das bei Suchergebnissen angezeigte von ... mitsamt Verlinkung
public $sourceRank; # Das Ranking für dieses Suchergebnis von der Seite, die es geliefert hat (implizit durch Ergebnisreihenfolge: 20 - Position in Ergebnisliste)
public $partnershop; # Ist das Ergebnis von einem Partnershop? (bool)
public $image; # Ein Vorschaubild für das Suchergebnis (als URL)
public $proxyLink; # Der Link für die Seite über unseren Proxy-Service
public $engineBoost = 1; # Der Boost für den Provider des Suchergebnisses
public $valid = true; # Ob das Ergebnis noch gültig ist (bool)
public $host; # Der aus dem Link gelesene Host des Suchergebnisses
public $strippedHost; # Der Host in Form "foo.bar.de"
public $strippedDomain; # Die Domain in Form "bar.de"
public $strippedLink; # Der Link in Form "foo.bar.de/test"
public $rank; # Das Ranking für das Ergebnis
# Erstellt ein neues Ergebnis
public function __construct($provider, $titel, $link, $anzeigeLink, $descr, $gefVon, $sourceRank, $partnershop = false, $image = "", $price = 0) public function __construct($provider, $titel, $link, $anzeigeLink, $descr, $gefVon, $sourceRank, $partnershop = false, $image = "", $price = 0)
{ {
$provider = simplexml_load_string($provider); $provider = simplexml_load_string($provider);
...@@ -24,14 +46,12 @@ class Result ...@@ -24,14 +46,12 @@ class Result
if ($this->sourceRank <= 0 || $this->sourceRank > 20) { if ($this->sourceRank <= 0 || $this->sourceRank > 20) {
$this->sourceRank = 20; $this->sourceRank = 20;
} }
$this->sourceRank = 20 - $this->sourceRank; $this->sourceRank = 20 - $this->sourceRank;
if (isset($provider["engineBoost"])) { if (isset($provider["engineBoost"])) {
$this->engineBoost = floatval($provider["engineBoost"]->__toString()); $this->engineBoost = floatval($provider["engineBoost"]->__toString());
} else { } else {
$this->engineBoost = 1; $this->engineBoost = 1;
} }
$this->valid = true; $this->valid = true;
$this->host = @parse_url($link, PHP_URL_HOST); $this->host = @parse_url($link, PHP_URL_HOST);
$this->strippedHost = $this->getStrippedHost($this->anzeigeLink); $this->strippedHost = $this->getStrippedHost($this->anzeigeLink);
...@@ -42,61 +62,90 @@ class Result ...@@ -42,61 +62,90 @@ class Result
$this->image = $image; $this->image = $image;
} }
/* Ranked das Ergebnis nach folgenden Aspekten:
* Startwert 0
* + 0.02 * Sourcerank (20 - Position in Ergebnisliste des Suchanbieters)
* * Engine-Boost
*/
public function rank(\App\MetaGer $metager) public function rank(\App\MetaGer $metager)
{ {
$rank = 0; $rank = 0;
$eingabe = $metager->getQ();
# Boost für Source Ranking
$rank += ($this->sourceRank * 0.02); $rank += ($this->sourceRank * 0.02);
#URL-Boost # Boost für passende ??? URL
$rank += $this->calcURLBoost($eingabe);
# Boost für Vorkommen der Suchwörter:
$rank += $this->calcSuchwortBoost($eingabe);
# Boost für Suchmaschine
if ($this->engineBoost > 0) {
$rank *= floatval($this->engineBoost);
}
$this->rank = $rank;
}
# Berechnet den Ranking-Boost durch ??? URL
public function calcURLBoost($tmpEingabe)
{
$link = $this->anzeigeLink; $link = $this->anzeigeLink;
if (strpos($link, "http") !== 0) { if (strpos($link, "http") !== 0) {
$link = "http://" . $link; $link = "http://" . $link;
} }
$link = @parse_url($link, PHP_URL_HOST) . @parse_url($link, PHP_URL_PATH); $link = @parse_url($link, PHP_URL_HOST) . @parse_url($link, PHP_URL_PATH);
$tmpLi = $link; $tmpLi = $link;
$tmpEingabe = $metager->getQ(); $count = 0;
$count = 0; $tmpLink = "";
$tmpLink = ""; # Löscht verschiedene unerwünschte Teile aus $link und $tmpEingabe
$regex = [ $regex = [
"/\s+/si", "/\s+/si", # Leerzeichen
"/http:/si", "/http:/si", # "http:"
"/https:/si", "/https:/si", # "https:"
"/www\./si", "/www\./si", # "www."
"/\//si", "/\//si", # "/"
"/\./si", "/\./si", # "."
"/-/si", "/-/si", # "-"
]; ];
foreach ($regex as $reg) { foreach ($regex as $reg) {
$link = preg_replace($regex, "", $link); $link = preg_replace($regex, "", $link);
$tmpEingabe = preg_replace($regex, "", $tmpEingabe); $tmpEingabe = preg_replace($regex, "", $tmpEingabe);
} }
#die($tmpLi . "<br>" . $link . "<br>" . $tmpEingabe . "<br><br>");
foreach (str_split($tmpEingabe) as $char) { foreach (str_split($tmpEingabe) as $char) {
if (!$char || !$tmpEingabe || strlen($tmpEingabe) === 0 || strlen($char) === 0) { if (!$char
|| !$tmpEingabe
|| strlen($tmpEingabe) === 0
|| strlen($char) === 0
) {
continue; continue;
} }
if (strpos(strtolower($tmpLink), strtolower($char)) >= 0) { if (strpos(strtolower($tmpLink), strtolower($char)) >= 0) {
$count++; $count++;
$tmpLink = str_replace(urlencode($char), "", $tmpLink); $tmpLink = str_replace(urlencode($char), "", $tmpLink);
} }
if (strlen($this->descr) > 80 && strlen($link) > 0) {
#$rank += $count /((strlen($link)) * 60);
}
} }
if (strlen($this->descr) > 80 && strlen($link) > 0) {
return $count / ((strlen($link)) * 60); # ???
} else {
return 0;
}
}
# Boost für Vorkommen der Suchwörter: # Berechnet den Ranking-Boost durch das Vorkommen von Suchwörtern
private function calcSuchwortBoost($tmpEingabe)
{
$maxRank = 0.1; $maxRank = 0.1;
$tmpTitle = $this->titel; $tmpTitle = $this->titel;
$tmpDescription = $this->descr; $tmpDescription = $this->descr;
$isWithin = false; $isWithin = false;
$tmpRank = 0; $tmpRank = 0;
$tmpEingabe = $metager->getQ();
$tmpEingabe = preg_replace("/\b\w{1,3}\b/si", "", $tmpEingabe); $tmpEingabe = preg_replace("/\b\w{1,3}\b/si", "", $tmpEingabe);
$tmpEingabe = preg_replace("/\s+/si", " ", $tmpEingabe); $tmpEingabe = preg_replace("/\s+/si", " ", $tmpEingabe);
#die($tmpEingabe);
foreach (explode(" ", trim($tmpEingabe)) as $el) { foreach (explode(" ", trim($tmpEingabe)) as $el) {
if (strlen($tmpTitle) === 0 || strlen($el) === 0 || strlen($tmpDescription) === 0) { if (strlen($tmpTitle) === 0 || strlen($el) === 0 || strlen($tmpDescription) === 0) {
continue; continue;
...@@ -118,35 +167,26 @@ class Result ...@@ -118,35 +167,26 @@ class Result
} }
} }
} }
$tmpRank /= sizeof(explode(" ", trim($tmpEingabe))) * 10;
$rank += $tmpRank;
if ($this->engineBoost > 0) {
$rank *= floatval($this->engineBoost);
}
$this->rank = $rank;
}
public function getRank() $tmpRank /= sizeof(explode(" ", trim($tmpEingabe))) * 10;
{ return $tmpRank;
return $this->rank;
} }
# Überprüft ob das Ergebnis aus irgendwelchen Gründen unerwünscht ist.
public function isValid(\App\MetaGer $metager) public function isValid(\App\MetaGer $metager)
{ {
# Zunächst die persönlich ( über URL-Parameter ) definierten Blacklists: # Perönliche URL und Domain Blacklist
if (in_array($this->strippedHost, $metager->getUserHostBlacklist()) if (in_array($this->strippedHost, $metager->getUserHostBlacklist())
|| in_array($this->strippedDomain, $metager->getUserDomainBlacklist())) { || in_array($this->strippedDomain, $metager->getUserDomainBlacklist())) {
return false; return false;
} }
# Jetzt unsere URL und Domain Blacklist # Allgemeine URL und Domain Blacklist
if ($this->strippedHost !== "" && (in_array($this->strippedHost, $metager->getDomainBlacklist()) || in_array($this->strippedLink, $metager->getUrlBlacklist()))) { if ($this->strippedHost !== "" && (in_array($this->strippedHost, $metager->getDomainBlacklist()) || in_array($this->strippedLink, $metager->getUrlBlacklist()))) {
return false; return false;
} }
# Nun der Eventuelle Sprachfilter # Eventueller Sprachfilter
if ($metager->getLang() !== "all") { if ($metager->getLang() !== "all") {
$text = $this->titel . " " . $this->descr; $text = $this->titel . " " . $this->descr;
$path = app_path() . "/Models/lang.pl"; $path = app_path() . "/Models/lang.pl";
...@@ -158,7 +198,7 @@ class Result ...@@ -158,7 +198,7 @@ class Result
} }
# Wir wenden die Stoppwortsuche an und schmeißen entsprechende Ergebnisse raus: # Stopworte
foreach ($metager->getStopWords() as $stopWord) { foreach ($metager->getStopWords() as $stopWord) {
$text = $this->titel . " " . $this->descr; $text = $this->titel . " " . $this->descr;
if (stripos($text, $stopWord) !== false) { if (stripos($text, $stopWord) !== false) {
...@@ -166,7 +206,7 @@ class Result ...@@ -166,7 +206,7 @@ class Result
} }
} }
# Die Strinsuche: # Phrasensuche:
$text = strtolower($this->titel) . " " . strtolower($this->descr); $text = strtolower($this->titel) . " " . strtolower($this->descr);
foreach ($metager->getPhrases() as $phrase) { foreach ($metager->getPhrases() as $phrase) {
if (strpos($text, $phrase) === false) { if (strpos($text, $phrase) === false) {
...@@ -175,9 +215,10 @@ class Result ...@@ -175,9 +215,10 @@ class Result
} }
# Abschließend noch 2 Überprüfungen. Einmal den Host filter, der Sicherstellt, dass von jedem Host maximal 3 Links angezeigt werden /* Der Host-Filter der sicherstellt,
# und dann noch den Dublettefilter, der sicher stellt, dass wir nach Möglichkeit keinen Link doppelt in der Ergebnisliste haben * dass von jedem Host maximal 3 Links angezeigt werden.
# Diese Überprüfung führen wir unter bestimmten Bedingungen nicht durch: * Diese Überprüfung führen wir unter bestimmten Bedingungen nicht durch.
*/
if ($metager->getSite() === "" && if ($metager->getSite() === "" &&
strpos($this->strippedHost, "ncbi.nlm.nih.gov") === false && strpos($this->strippedHost, "ncbi.nlm.nih.gov") === false &&
strpos($this->strippedHost, "twitter.com") === false && strpos($this->strippedHost, "twitter.com") === false &&
...@@ -190,7 +231,9 @@ class Result ...@@ -190,7 +231,9 @@ class Result
} }
} }
# Unabhängig davon unser Dublettenfilter: /* Der Dublettefilter, der sicher stellt,
* dass wir nach Möglichkeit keinen Link doppelt in der Ergebnisliste haben.
*/
if ($metager->addLink($this->strippedLink)) { if ($metager->addLink($this->strippedLink)) {
$metager->addHostCount($this->strippedHost); $metager->addHostCount($this->strippedHost);
return true; return true;
...@@ -199,6 +242,11 @@ class Result ...@@ -199,6 +242,11 @@ class Result
} }
} }
/* Liest aus einem Link den Host.
* Dieser wird dabei in die Form:
* "http://www.foo.bar.de/test?ja=1" -> "foo.bar.de"
* gebracht.
*/
private function getStrippedHost($link) private function getStrippedHost($link)
{ {
if (strpos($link, "http") !== 0) { if (strpos($link, "http") !== 0) {
...@@ -209,6 +257,12 @@ class Result ...@@ -209,6 +257,12 @@ class Result
$link = preg_replace("/^www\./si", "", $link); $link = preg_replace("/^www\./si", "", $link);
return $link; return $link;
} }
/* Entfernt "http://", "www" und Parameter von einem Link
* Dieser wird dabei in die Form:
* "http://www.foo.bar.de/test?ja=1" -> "foo.bar.de/test"
* gebracht.
*/
private function getStrippedLink($link) private function getStrippedLink($link)
{ {
if (strpos($link, "http") !== 0) { if (strpos($link, "http") !== 0) {
...@@ -220,6 +274,11 @@ class Result ...@@ -220,6 +274,11 @@ class Result
return $host . $path; return $host . $path;
} }
/* Liest aus einem Link die Domain.
* Dieser wird dabei in die Form:
* "http://www.foo.bar.de/test?ja=1" -> "bar.de"
* gebracht.
*/
private function getStrippedDomain($link) private function getStrippedDomain($link)
{ {
if (preg_match("/([^\.]*\.[^\.]*)$/si", $link, $match)) { if (preg_match("/([^\.]*\.[^\.]*)$/si", $link, $match)) {
...@@ -229,6 +288,7 @@ class Result ...@@ -229,6 +288,7 @@ class Result
} }
} }
# Erstellt aus einem Link einen Proxy-Link für unseren Proxy-Service
private function generateProxyLink($link) private function generateProxyLink($link)
{ {
if (!$link) { if (!$link) {
...@@ -241,4 +301,11 @@ class Result ...@@ -241,4 +301,11 @@ class Result
return "https://proxy.suma-ev.de/cgi-bin/nph-proxy.cgi/en/I0/" . $tmp; return "https://proxy.suma-ev.de/cgi-bin/nph-proxy.cgi/en/I0/" . $tmp;
} }
# Getter
public function getRank()
{
return $this->rank;
}
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment