Projektion einer TAG-Verteilung in Apache Solr auf eine WordPress TAG-Cloud

Autor: Rangel Stefanov, 21.03.2016 um 13:00 Uhr | Kategorien: Entwicklung | Lucene & Solr | WordpressSchreibe einen Kommentar

In seinem letzten Post hat Tom beschrieben, wie in WordPress mit Hilfe einer zusätzlichen Taxonomie verschiedene Tag-Clouds für Solr- und WordPress-TAGs angezeigt werden können. Tom hat schon die Einbindung der zusätzlichen TAG-Cloud erklärt, ich beschreibe heute den vorletzten Schritt des Prozesses, nämlich die Tag-Verteilung von Solr auf WordPress.  Das Konzept der Verteilung kommt von Tom, und ich habe die Realisierung übernommen.

Dummy Posts als TAG-Anker

Zuerst habe ich sechs Dummy Posts auf WordPress angelegt. In den Posts werden die Tags von Solr gespeichert. Es spielt überhaupt keine Rolle, wie die Posts heißen, aber später werden die Namen der Posts bei der Erstellung der Tags genutzt.

DummyPostsAlsTagAnker

Abfrage der TAGs aus Apache Solr via curl Rest

Der Code für die Umsetzung besteht aus JavaScript- und PHP-Methoden. Im ersten Schritt wird eine Solr Anfrage über PHP und Curl getriggert. Solr wird mittels HTTP-GET angesprochen und liefert einen Response im json Format zurück.
Meine Anfrage enthält folgende Parameter:

  • q=a_tag
  • fq=a_verified:true
  • fl=a_tag, a_verified (gibt an, welche Felder angezeigt werden sollen)
  • rows=2147483647 (so werden alle Zeilen zurückgegeben, wir wollen kein Paging)

Die Parameter q und fq identifizieren alle bestätigten (a_verified=true) Solr-Dokumente, bei denen das Attribut a_tag überhaupt gesetzt ist.

In der folgenden Methode kann man erkennen, wie mit Hilfe von curl_init() eine cURL-Session initialisiert, alle für den Transfer nötigen Optionen unter Verwendung von curl_setopt() gesetzt und dann die Session mittels curl_exec() ausgeführt wird. Am Ende wird schließlich die Session wieder mit curl_close() beendet.

function search_tags() {

$solr_url ="https://solrhost/select?wt=json&q=a_tag:*&fq=a_verified:true& 
fl=a_tag,a_verified&rows=2147483647";

	$solr_auth = "…";
	$curl = curl_init ();
	curl_setopt ( $curl, CURLOPT_VERBOSE, 1 );
	
	if (! $curl) {
		throw new Exception ( 'failed to initialize' );
	}
	
	// authentication
	curl_setopt ( $curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC );
	curl_setopt ( $curl, CURLOPT_USERPWD, $solr_auth );
	
	// self signed certificate
	curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, false );
	curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, false );
	
	curl_setopt ( $curl, CURLOPT_URL, $solr_url );
	curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 );
	
	$result = curl_exec ( $curl );
	
	if (! $result) {
		$error = curl_error ( $curl );
		$errno = curl_errno ( $curl );
	}
	
	curl_close ( $curl );
	
	return $result;
}

Projektion der TAG-Häufigkeit in Solr auf 1 bis 6 zu taggende Dummy-Posts

Im nächsten Schritt werden die Ergebnisse aus Solr iteriert, und es wird berechnet, wie viel Mal jedes Tag in Solr-Dokumenten verwendet wird. Die Anzahl und der Name des Tags werden in einer Map hinzugefügt. Mit der Map rufe ich die nächste PHP Methode auf, die ihr unten seht.

Diese Methode liest aus der Map, wie oft ein TAG in Solr-Dokumenten vorkommt und bestimmt daraus, an wie viele Posts der Tag angehängt werden soll. Die wichtigsten Methoden der WordPress PHP API, die ich benutze, sind get_page_by_title() und wp_set_post_terms(). Die erste liefert ein Objekt zurück, das den Post enthält, und die zweite legt den TAG in dem Post an.

function create_tag($indata){
	$dummy_posts = array('Z1', 'Z2', 'Z3', 'Z4', 'Z5', 'Z6');
	$keys = array_keys($indata);
	$arrlength = count($keys);
	$result = array();

	for($x = 0; $x < $arrlength; $x++) { 
	$tag = $keys[$x]; 
	$count = $indata[$keys[$x]]; 
	$reqPosts = 0; 
	if($count > 9 && $count < 19){ 
		$reqPosts = 2; 
	}else if($count > 19 && $count < 29){ 
		$reqPosts = 3; 
	}else if($count > 29 && $count < 39){ 
		$reqPosts = 4; 
	}else if($count > 39 && $count < 49){ 
		$reqPosts = 5; }
	else if($count > 49){
		$reqPosts = 6;
	} else {
		$reqPosts = 1;
	}
		
	for($i = 0; $i < $reqPosts; $i++){ 
		$post_name = $dummy_posts[$i]; 
		$post = get_page_by_title( $post_name, OBJECT, 'post' ); 
		if($post != null){ 
			$result[$x] = $post_name . ' : ' . $tag . ' : ' . wp_set_post_terms( $post->ID, $tag, 'stag', true )[0];
		}else{
			$result[$x] = $post_name . ' : post cannot be found!';
		}
	}			
	return $result;
}

Endergebnis

Im Endeffekt sollen die Posts im WordPress so aussehen: Der Post mit dem Namen Z1 enthält die Tags, die 1- oder n- Mal im Solr in Solr-Dokumenten vorkommen, nämlich alle Tags.

PostZ1MitAllenTags

Der Post Z3 beispielsweise erhält stattdessen nur jene TAGs, die mindestens 20 mal in Solr vorkommen. (Diese Tags werden ebenfalls an Z1 und Z2 angehängt.)

TagsAnPostZ3

Schließlich muss natürlich verhindert werden, dass jene Dummy-Tags, die wir nutzen, um die Tag-Häufigkeit zu projiezieren, in WordPress angezeigt werden. Wie das funktioniert, lest ihr wieder in Toms Post.

Kommentare

Es gibt noch keine Kommentare

Back to top

feedback erwünscht

Über alles was wir so bloggen, reden wir auch gerne.
Melden Sie sich bei Uns, wir freuen uns über jeden direkten Austausch.

Back to top