Anwenden der Solr-Suche mit Hilfe der PHP-API

Aus SiteparkWiki
Zur Navigation springen Zur Suche springen

Für die Durchführung von Suchen auf Basis eines Solr-Index wird über das Solr-Module eine PHP-Api zur Verfügung gestellt. Dieser Artikel beschreibt die Voraussetzungen zur Nutzung dieser Api sowie einige Bespiele.

Voraussetzungen

Um die verschiedenen Funktionen der Solr-Engine nutzen zu können müssen die zu durchsuchenden Webseiten bestimmte Meta-Informationen zur Verfügung stellen, auf Basis derer die Suche mit verschiedenen Filtern angewandt werden können. Zusätzlich werden auch die folgenden 'Standard-Daten' jeder Seite in dem Index abgelegt:

  url              // Die Url der Seite. Wenn der Host dem des Publikationsbereiches entspricht, wird nur der Pfad ohne den Host hinterlegt.
  id               // ID innerhalb des Solt-Index. Entspricht der Url.
  title            // Der Html-Title der Webseite
  keywords         // Der Inhalt des Html Meta-Tags 'keywords' mit weiteren Synonymen, die den Inhalt beschreiben. (<meta name="keywords" content="Synonym">)
  description      // Eine Kurzbeschreibung aus dem 'description' Meta-Tag (<meta name="description" content="Kleine Beschreibung">)

Weitere Daten werden während des Indizierens automatisch ermittelt und an dem Eintrag hinterlegt.

  contenttype      // zB: "text/html; charset=UTF-8"
  contentlength    // Die Dateigröße bei Medien.
  lang             // Sprache des Inhalts zB: "de" oder "en". Oder "unknown", für den Fall, dass die Ermittlung nicht möglich war.
  content          // Der gesamte Inhalt der Seite

Für weiter Filtermöglichkeiten und Facettierungen werden außerdem die folgenden Felder hinterlegt, sofern Sie über die Webseite zur Verfügung gestellt wurden.

  sp_title         // Die redaktionelle Überschrift der Seite, der von dem Html-Title abweichen kann
  sp_intro         // Eine kurze Einleitung (kann der 'description' gleichen)
  sp_rubrik        // Eine textuelle Angabe der Rubrik wie 'Freizeit und Sport'
  sp_source        // Ein Schlüssel, der die Zugehörigkeit bestimmt. zB. zu einer Homepage, Microsite oder Vereinsregister
  sp_contenttype   // Typ der Seite wie 'content', 'gallery' oder 'movie'
  sp_category      // Liste von im IES verknüpften Kategorien (zB: 'id1542', 'id94641')
  sp_category_path // Liste mit allen hierarchischen Eltern der verknüpften Kategorien.
  sp_group_path    // Liste des IES-Artike-Pool Pfades, in dem die Seite erstellt ist. 
  sp_theme         // Möglichkeit zur Angabe eines Themes (projektspezifisch)
  sp_archive       // 'true' oder 'false', je nach dem ob der Artikel redaktionell als zu archivieren gekennzeichnet ist.
  sp_date          // redaktionell angegebenes Datum der Artikels 
  sp_date_from     // Bei (mehrtägigen) Terminen oder Veranstaltungen kann sowohl ein von 
  sp_date_to       // als auch ein bis Datum angegeben werden.

Für das Produkt CityGov werden weitere Felder definiert, die hier aber nicht aufgelistet werden.

Um die Daten in der Webseite zur Verfügung zu stellen gibt es zwei Möglichkeiten. Hier ein Beispiel für die Angabe in separaten Meta-Tags

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
  <head>
  <title>Marionettentheater, Stadt Goldenberg</title>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <meta name="sp_title"           content="Marionetten-Theater"/>
  <meta name="sp_intro"           content="Marionetten-Theater in Goldenberg ist ein kleines Welttheater für Kinder und Erwachsene./>
  <meta name="sp_source"          content="id36752" />
  <meta name="sp_rubrik"          content="Tourist Service Center" />
  <meta name="sp_category"        content="id16841" />
  <meta name="sp_language"        content="de" />
  <meta name="sp_contenttype"     content="content" />
  <meta name="sp_date"            content="2014-09-26T10:34:00Z" />
  ...

</html>


Bevorzugt wird allerdings die folgende, Html5 konforme Angabe im JSON-Format

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
  <head>
  <title>Marionettentheater, Stadt Goldenberg</title>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <meta name="application-name" content="Infosite" data-content-type="json" data-namespace="sp_" data-content="{
      title       : 'Marionettentheater',
      intro       : 'Marionetten-Theater in Goldenberg ist ein kleines Welttheater für Kinder und Erwachsene.',
      source      : 'id36752',
      rubrik      : 'Tourist Service Center',
      category    : ['id16841'],
      language    : 'de',
      contenttype : 'content',
      date        : '2014-09-26T10:34:00Z'}"
  />
  ...
</html>

Suche über die API

Das folgende einfache Beispiel die Verwendung der PHP API, mit dessen Hilfe auf einen konfigurierten Solr-Index gesucht werden kann. Voraussetzung ist, dass die IES-Module Solr und die Basis-PHP-API installiert sind.

  // Die benötigten Klassen:
  require_once ('SP/Solr/Connection.php');
  require_once ('SP/Solr/Url.php');
  require_once ('SP/Solr/Query/SearchQuery.php');
  require_once ('SP/Solr/Pagination.php');
  require_once ('SP/Solr/Query/Response.php');

  // Aufbau der Verbindung zu dem Solr-Index
  $connection = new SP_Solr_Connection(array(
      'core' => array('core_1'))                     // Die in der Solr-Konfiguration angegebenen Id des Solr Index (auch Core genannt)
  ));

  // Erstellen einer Suchanfrage
  $myQuery = new SP_Solr_Query_SearchQuery();
  $myQuery->setQueryString("Marionetten");           // Suche alle Artikel, die den Begriff 'Marionetten' enthalten. 

  // Ausführen der Suche
  $result = $connection->executeQuery($myQuery);

  // Ergebnisse auflisten. 
  if ($result->hasResults()) {
    echo $result->getNumFound . ' Seiten gefunden.<br>';
    foreach($result as $hitStdClass) {
      echo $hitStdClass->title . '<br>';
    }
  }

Suche mit Filtern und bestimmter Ergebnismenge

Weitere Methoden des SearchQuery Objektes können zur Angabe von Paging-Informationen, diversen Filtern und die Angabe von Daten in der ErgebnisListe genutzt werden:

  $myQuery->setStart(30)                                         // Rückgabe ab dem 30. Suchergebnis
          ->setRows(15)                                          // Liefere die nächsten 15 Treffer
          ->setReturnFields('url', 'title', 'sp_contenttype')    // Daten innerhalb der Suchergebnis-Treffer, die angezeigt werden können. 
          ->addSortField('sp_title', 'asc')                      // Von der Relevanz abweichende Sortierung
          ->addFilterQuery('-sp_contenttype', 'movie');          // ergänzende Filter


Suche mit Suggest bzw. Spellcheck

Neben der Suche können über die API auch die Funktionen zur Ermittlung Vorschlägen (suggest oder 'meinten Sie') und Facetten genutzt werden.

  $myQuery = new SP_Solr_Query_SpellcheckQuery();
  $myQuery->setSpellcheckQuery('Marioneten');
  $result = $connection->executeQuery($myQuery);
  $spellcheckArray = $solrResponse->getSpellcheck());            // Das Ergebnis enthält die Vorschläge mit der jeweiligen Anzahl von Seiten die den Begriff enthalten.


Ermittlung von Facetten

  $facetQuery = new SP_Solr_Query_FacetQuery();
  $facetQuery->setQueryString('Marionetten')                     // Bei der Ermittlung der Facetten kann eine einschränkende Suche erfolgen. 
             ->addFacetField('sp_source')
             ->addFacetQuery('sp_dateMonth', 'sp_date:[NOW-31DAYS/DAY TO NOW/DAY]');
  $facetResult = $connection->executeQuery($facetQuery);
  $facetResultArray = $facetResult->getFacetFields()             // getFacetFields liefert die folgende JSON-Struktur:
								 // {
								 //	'sp_source': [
								 //		{'id36752' => 15},
								 //		{'id52145' => 1}
								 //	],
								 //	'sp_date': [
								 //		{'sp_dateMonth' => 25},
								 //	...

Auflistung von Suchergebnissen mit Paging

  //..
  // die Suche (s.o.)
  $result = $connection->executeQuery($myQuery); 

  // Einlesen des Paging-Parameters
  $pagingIndex = isset($_REQUEST['p']) ? $_REQUEST['p'] : 0;
  if ($pagingIndex > 0) {
    $myQuery->setStart(($pagingIndex) * $hitsPerPage);
  } 

  // Url mit den passenden Werten für die Paging-Verweise
  $pagingUrl = new SP_Solr_Url();
  $pagingUrl->removeParam('p')->addParam('query',$query );

  // Paging Objekt für die Ausgabe der Paging-LinkListe konfogurieren 
  $paging = new SP_Solr_Pagination();
  $paging->setHitsPerPage($hitsPerPage)
       ->setHits($result->getNumFound())
       ->setCurrentPage($pagingIndex)
       ->setBaseUrl($pagingUrl->getUrl()); 


  // Ausgabe der Paging-Links
  if ($result->hasResults()) { 
    if ($result->getNumFound()  > $hitsPerPage) {
      foreach ($paging->getPages(5) as $index => $pageLink) {
        if ($index > 0 ) {
          echo " | ";
        }
        if ($pageLink['current'] === true) {
          echo "<b>" . $pageLink['no'] . "</b> \n";
        } else {
          echo "<a href=" . $pageLink['url'] . " >" . $pageLink['no'] . "</a>\n";
        }
      }
    }
  }


Nützliche Parameter für die Solr-Weboberfläche

Field-Boostings:

&defType=edismax
&qf=sp_title^1.2 keywords^1.1 description^1 title^1 url^0.9 content^0.9

Boost-Function:

bf=if(termfreq(sp_objecttype,news),scale(sp_date,-10,0),0)
bf=if(termfreq(sp_objecttype,searchTip),2,0)