Metasuche/neue Schnittstelle

aus wiki, dem genealogischen Lexikon zum Mitmachen.
Version vom 8. Februar 2013, 12:22 Uhr von Jzedlitz (Diskussion • Beiträge) (ein paar genauere Erklärungen)
Zur Navigation springen Zur Suche springen

Die Metasuche http://java-dev.genealogy.net/metasearch/ hat eine stark vereinfachte Schnittstelle bekommen, so dass die Anbindung weitere Suchmaschinen einfacher geworden ist.

Per HTTP POST[1] werden folgende Anfrage-Parameter übertragen:

  • lastname
  • placeid - GOV-Kennung des Ortes
  • placename
  • since - (optional) liefere nur Einträge, die jünger als das angegebene Datum sin. Datum der Form yyyy-mm-dd

Die Werte der Anfrage werden dabei mit UND verknüpft.

Erwartet wird ein Ergebnis (Content-Type muss auf 'text/xml' gesetzt sein!) in der folgenden Form:

<result>
  <database>
    <name>GEDBAS</name>
    <url>http://gedbas.genealogy.net</url>
    <entry>
      <lastname>lastname 0</lastname>
      <firstname>firstname 0</firstname>
      <details>details 0</details>
      <url>http://localhost/data/0</url>
    </entry>
    <entry>
      <lastname>lastname 1</lastname>
      <firstname>firstname 1</firstname>
      <details>details 1</details>
      <url>http://localhost/data/1</url>
    </entry>
    ...
    <more>true</more>  <!-- wenn das "more"-Element enthalten ist, zeigt das an, dass es noch mehr Treffer als die zurückgelieferten gibt -->
  </database>
</result>

Bei einer leeren Suchanfrage (weder lastname, noch placeid, noch placename gesetzt) sollte ein leeres Ergebnis zurückgegeben werden:

<result>
  <database>
    <name>GEDBAS</name>
    <url>http://gedbas.genealogy.net</url>
  </database>
</result>

Das gleiche Ergebnis soll auch zurückgeliefert werden, wenn keine Treffer gefunden werden:

<result>
  <database>
    <name>GEDBAS</name>
    <url>http://gedbas.genealogy.net</url>
  </database>
</result>

PHP

<?php
# Eine Hilfsfunktion, die den Inhalt der Parameter aus der HTTP-Anfrage ausliest.
function get_http_var($name, $default=''){
  global $_GET, $_POST;
  if (array_key_exists($name, $_GET)){return trim($_GET[$name]);}
  if (array_key_exists($name, $_POST)){return trim($_POST[$name]);}
  return $default;
}

$lastname  = get_http_var('lastname');
$placename = get_http_var('placename');
$govId = get_http_var('placeid');

header('Content-type: text/xml');
echo "<result>";
echo "<database>";
echo "<name>Beispiel</name>";
echo "<url>http://example.org</url>";

# An dieser Stelle die Suche durchfüren und über die Ergebnisse iterieren
for( $i = 0; $i < $anzahl_ergebnisse; $i++ ) {

  echo "<entry>";
  echo "<lastname>...</lastname>";
  echo "<firstname>...</firstname>";  # Wenn die Datenbank keinen Nachnamen enthält, kann dieses Element weggelassen werden
  echo "<details>...</details>";      # Die Details können beliebige Informationen enthalten, z.B. Geburts- und Sterbedatum
  echo "<url>http://example.org/anzeige?id=...</url>"; # ein direkter Link auf den Datensatz
  echo "</entry>";

} # für die Ergebnisse

# Wenn es noch mehr Ergebnisse als die zurückgelieferten gibt, wird ein Element "more" eingefügt.
if( $anzahl_ergebnisse > 20 ) {
   echo "<more>true</more>";
}

echo "</database>";
echo "</result>";
?>

Grails

if( !(params.lastname || params.placename || params.placeid) )
  render(contentType:"text/xml") {
    error()
  }

def criteria = Entry.createCriteria() 
def results = criteria.list([max:21]) {
  // Suche durchführen
}

render(contentType:"text/xml") {
  'result' {
    database {
        name('Datenbank Historischer Adressbücher')
        url('http://adressbuecher.genealogy.net')
        for( int i = 0; i< Math.min(results.size(),20); i++) {
            Entry e = results[i]
            entry {
                lastname(e.lastname)
                firstname(e.firstname)
                details("${e.book?.title} ${e.book?.year}")
                url(g.createLink(controller:'entry',action:'show',id:e.id,absolute:true))
            }
        }
        if( results.size()> 20 )
            more('true')
    }
}

  1. Der HTTP-Standard macht leider widersprüchliche Angabe, wie nicht-ASCII-Zeichen bei GET-Anfragen zu behandeln sind. Das hat früher immer wieder für Probleme gesorgt. Bei einem POST kann man den Zeichensatz angeben, so dass die Probleme dort nicht auftreten.