eZ Find Befehle für Solr

In der Regel wird eZ Find nur für die Suchseite in eZ Publish verwendet, kommt aber auch für Facettierungen in Onlineshops zum Einsatz. Doch ich nutze eZ Find auch für normale Auflistungen. Der Fetch Befehl ist 100mal besser als der Standard Befehl von eZ Publish.

Damit es los gehen kann, muss natürlich eZ Find installiert und Solr gestartet sein. Die Erweiterung ist schnell installiert, doch mit Solr haben die meisten Entwickler ihre Probleme. Aber eigentlich geht das Ruck Zuck. Solr wird im eZ Find Packet mitgeliefert und findet sich unter ezfind/java/

cd extension/ezfind/java
java -Dezfind -jar start.jar

Das war es auch schon, mehr ist nicht dahinter. Falls du Solr im Multicore Modus starten möchtest:

sudo java -jar -Dsolr.solr.home=solr.multicore -jar start.jar

So, nun gehen wir einen Schritt weiter.

eZ Find Fetch

Bevor wir uns aber näher mit dem Fetch-Befehl beschäftigen, müssen wir uns in einem Punkt klar sein. Die Felder müssen alle indiziert sein! Also nicht vergessen im Klassen-Editor unter Setup das Flag „Durchsuchbar“ zu setzen. Nach jeder Änderung sollte eine komplette Re-Indizierung gestartet werden. TIPP: Wenn du einen Objectstate hinzufügst -> reindizieren!! Zur Info: eZ Find indiziert viele weitere Informationen wie Veröffentlicht am, Editor usw.

Indizierung über die Shell starten:

php extension/ezfind/bin/php/updatesearchindexsolr.php -s ADMINSITEACCESS

So, wenn das alles geschafft ist, gehe ich in der Regel zuerst ins Solr Admin Interface – SERVERIP:8983/solr/admin/ nicht erschrecken, dass schaut dann etwas Retro aus. Reicht aber voll für unsere Zwecke.

In dem Interface findest du die Eingabe „Query String„. Dort kann man mal nach einer Node suchen.

meta_main_node_id_si:2

Die 2 ist die NodeID -> die Startseite. So, nun bekommen wir ein langes XML. Hier schaue ich immer, nach welchen Feldern ich suchen kann. In den ersten Stunden in meinem „Solr“ Leben kam mir das alles sehr, sehr kryptisch vor, doch mit der Zeit blickt man da durch. Also keine Bange.

So schaut in der Regel das Fetch-Statement aus:

{def $search = fetch('ezfind', 'search', hash(
	'query',  '',
	'class_id', array('article'),
        'limit', '10',
	'sort_by', $sort_by,
	'subtree_array', $category_array,
	'filter', array(
		array(
			array('article/invisible_in_overview:0')
			)
			)
	)))
	$sorted_children_array = $search['SearchResult']
}

Erklärung zu den einzelnen Attributen:

query Dies wird nur gefüllt, wenn man nach irgendeinem Wort sucht
class_id Hier kannst du eZ Find sagen ’suche in folgenden Klassen‘
limit Das Limit ist wichtig für die Beschränkung der Anzeige (z.B.: Paging)
offset Wird ebenfalls fürs Paging verwendet
subtree_array Einschränkung, in welchen Knoten gesucht werden soll, ähnlich dem parent_node_id im eZ Fetch
sort_by Sortierung
filter Das klassische WHERE in Solr

Beim Filter wird es nun spannend und interessant. Info: Es gibt noch einige weitere Attribute, auf die ich heute nicht eingehen werde.

Schon mal probiert mit einem eZ Fetch über mehre Klassen zu suchen und klassenübergreifend zu sortieren und dann noch zum Beispiel nur Artikel anzuzeigen, die jünger als 24 Stunden alt sind? Nein? Ich auch nicht, weil das nicht geht. Aber mit eZ Find kann man solche komplexen Abfragen starten. Wie das geht?

eZ Find Basic

Beispiel:

  • Sortierung über 2 Klassen
  • Artikel die max. 24 Stunden alt sind

im sort_by

array(array('article/name','asc'),array('events/name','desc'))

und im filter

array('meta_published_dt:[NOW/HOUR-24HOUR TO NOW/HOUR+1HOUR]')

Fertig, das wars auch schon.

Wie schaut mein Solr Befehl aus?

Diese Frage stelle ich mir heute noch sehr oft. Es gibt ein paar grundlegende Befehle mit denen man 90% des Alltags abdecken kann.

entweder mit meta_path_si:(225) oder mit einer „OR“ meta_path_si:(225 2) – einfach mit einem Leerzeichen trennen
String durchsuchen – entweder direkt über eZ Find Mapping „KLASSE/title:Blog“ oder direkt über das Attribute „attr_title_s:Blog“

Natürlich kann man auch nach Datumsfeldern suchen und filten. Beim eZ Summer Camp in Kroatien hat man uns erzählt, man kann sogar über die Object Realtion filtern. (Dieses Beispiel habe ich aber noch nicht ausprobiert.)

{def $searchResults = fetch( 'ezfind', 'search', hash( 'query', '',
'filter', array('article/testrelation/caption:specialvalue1')))

Zur Info: eZ Find gibt einen Array zurück. Das Ergebnis findet man im Key „SearchResult“

Links zu eZ Find:

David Hohl

Seit 1995 Entwickler und Projektleiter. Langjährige Erfahrung mit eZ Publish. War von 2012 bis 2014 bei silver.solutions als Entwickler, Konzeptionen und Projektleiter für eZ Publish Projekte verantwortlich.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Sicherheitsfrage * Time limit is exhausted. Please reload CAPTCHA.