Einführung von Anda: ein neuer Crawler in Lucidworks Fusion
Einführung Entwicklung eines Crawlers Schreiben einer Fetcher Inkrementelles Crawling Emittierender Inhalt Konfiguration Fehlerbehandlung Was kommt als Nächstes? Zusätzliche Lektüre Einführung…
Einführung
Lucidworks Fusion 2.0 wird mit etwa 30 vorkonfigurierten Konnektoren ausgeliefert, die die Datenaufnahme aus einer Vielzahl gängiger Datenquellen erleichtern. 10 dieser Konnektoren werden von einem neuen Allzweck-Crawler-Framework namens Anda unterstützt, das bei Lucidworks entwickelt wurde, um die Entwicklung von Crawlern zu vereinfachen und zu rationalisieren. Die Konnektoren zu jeder der folgenden Fusion-Datenquellen werden von Anda unterstützt:
- Web
- Lokale Datei
- Box
- Dropbox
- Google Drive
- SharePoint
- JavaScript
- JIRA
- Drupal
- Github
Die Inspiration für Anda ergab sich aus der Erkenntnis, dass die meisten Crawling-Aufgaben in den verschiedenen Crawler-Implementierungen ziemlich viele Gemeinsamkeiten aufweisen. Ein großer Teil der Arbeit, die mit der Entwicklung eines Crawlers verbunden ist, ergibt sich aus allgemeinen Anforderungen, die nichts mit der genauen Art der zu durchsuchenden Datenquelle zu tun haben, was auf die Notwendigkeit einiger wiederverwendbarer Abstraktionen hinweist. Die folgenden Crawler-Funktionen sind vollständig im Code des Anda-Frameworks implementiert. Obwohl ihr Verhalten über Eigenschaften in Fusion-Datenquellen konfigurierbar ist, muss der Entwickler eines neuen Anda-Crawlers keinen eigenen Code schreiben, um diese Funktionen zu nutzen:
- Starten, Anhalten und Abbrechen von Crawls
- Konfigurationsmanagement
- Pflege und Persistenz der Crawl-Datenbank
- Link-Legalitätsprüfungen und Link-Rewriting
- Multithreading und Thread-Pool-Verwaltung
- Drosselung
- Recrawl-Richtlinien
- Löschung
- Handhabung von Aliasen
- Entdoublierung ähnlicher Inhalte
- Aufteilung von Inhalten (z.B. CSV und Archive)
- Emittierender Inhalt
Stattdessen reduziert Anda die Aufgabe, einen neuen Crawler zu entwickeln, darauf, dem Anda-Framework den Zugriff auf Ihre Daten zu ermöglichen. Entwickler stellen diesen Zugriff bereit, indem sie eine von zwei Java-Schnittstellen implementieren, die den Kern der Anda-Java-API bilden: Fetcher
und FS
(kurz für Filesystem). Diese Schnittstellen stellen dem Framework-Code die notwendigen Methoden zur Verfügung, um Dokumente aus einer Datenquelle zu holen und ihre Links zu erkennen, so dass eine Traversierung zu weiteren Inhalten in der Datenquelle möglich ist. Fetcher
und FS
sind so einfach wie möglich zu implementieren, wobei die gesamte Traversierungslogik in den Framework-Code verlagert wird.
Entwicklung eines Crawlers
Bei so vielen generischen Crawling-Aufgaben ist es einfach ineffizient, für jede zusätzliche Datenquelle einen völlig neuen Crawler zu schreiben. In Anda ist also das Framework selbst im Wesentlichen ein Crawler, und wir erweitern den Zugriff auf die Daten, die wir crawlen möchten. Die Schnittstelle Fetcher
ist die generischere von zwei Möglichkeiten, diesen Zugriff zu ermöglichen.
Schreiben einer Fetcher
public interface Fetcher extends Component<Fetcher> { public Content fetch(String id, long lastModified, String signature) throws Exception; }
Fetcher
ist eine bewusst einfach gehaltene Java-Schnittstelle, die eine Methode fetch()
zum Abrufen eines Dokuments aus einer Datenquelle definiert. Es gibt eine WebFetcher
Implementierung von Fetcher
in Fusion, die weiß, wie man Webseiten abruft (wobei das id
Argument für fetch()
eine Webseiten-URL ist), eine GithubFetcher
für Github-Inhalte, usw. Die Methode fetch()
gibt ein Content
Objekt zurück, das den Inhalt des „Elements“ enthält, auf das id
verweist, sowie alle Links zu weiteren „Elementen“, was auch immer das sein mag. Das Framework selbst ist völlig unabhängig von der genauen Art der „Elemente“/Datenquelle, die im Spiel ist – der Umgang mit allen datenquellenspezifischen Details ist Aufgabe von Fetcher
.
Eine Fusion-Datenquellendefinition versorgt Anda mit einer Reihe von Start-Links (über die Eigenschaft startLinks
), die die ersten Aufrufe an fetch()
starten, um mit dem Crawling zu beginnen. Von dort aus wird die Traversierung über Links fortgesetzt, die in Content
-Objekten von fetch()
zurückgegeben werden. Crawler-Entwickler schreiben einfach Code, um ein Dokument zu holen und dessen Links zu weiteren Dokumenten zu erkennen, und das Framework übernimmt den Rest. Beachten Sie, dass die Implementierungen von Fetcher
thread-sicher sein sollten. Die Eigenschaft fetchThreads
datasource steuert die Größe des Thread-Pools des Frameworks für den Abruf.
Inkrementelles Crawling
Die zusätzliche lastModified
und signature
Argumente für fetch()
ermöglichen inkrementelles Crawling. Die Pflege und Persistenz einer Crawl-Datenbank ist eine der wichtigsten Aufgaben, die vollständig vom Framework übernommen wird. Werte für lastModified
(ein Datum) und signature
(ein optionaler String-Wert, der eine beliebige Art von Zeitstempel angibt, z.B. ETag in einem Web-Crawl) werden als Felder von Content
Objekten zurückgegeben, in der Crawl-Datenbank gespeichert und dann aus der Crawl-Datenbank gelesen und bei erneuten Crawls an fetch()
übergeben. Ein Fetcher
sollte diese Metadaten verwenden, um den Inhalt eines Objekts optional nicht zu lesen und zurückzugeben, wenn er sich seit dem letzten Crawl nicht geändert hat, z.B. durch das Setzen eines If-Modified-Since
Headers zusammen mit dem lastModified
Wert im Falle von HTTP-Anfragen. Für das Szenario, dass ein unverändertes Objekt nicht abgeholt werden muss, gibt es spezielle „discard“ Content
Konstruktoren.
Emittierender Inhalt
Content
Objekte, die von fetch()
zurückgegeben werden, können bei inkrementellen Crawls verworfen werden, aber diejenigen, die tatsächlichen Inhalt enthalten, werden an die Fusion-Pipeline zur Verarbeitung und zur Indizierung in Solr weitergeleitet. Der Crawler-Entwickler braucht dafür keinen Code zu schreiben. Die Eigenschaft pipelineID
aller Fusion-Datenquellen konfiguriert die Pipeline, durch die die Inhalte verarbeitet werden, und der Benutzer kann die verschiedenen Phasen dieser Pipeline über die Fusion-Benutzeroberfläche konfigurieren.
Konfiguration
Fetcher
erweitert eine andere Schnittstelle namens Component
, die zur Definition des Lebenszyklus und zur Bereitstellung der Konfiguration verwendet wird. Die Konfigurationseigenschaften selbst werden mit einer Anmerkung namens @Property
definiert, z.B.:
@Property(title="Obey robots.txt?", type=Property.Type.BOOLEAN, defaultValue="true") public static final String OBEY_ROBOTS_PROP = "obeyRobots";
In diesem Beispiel von WebFetcher
(der Fetcher
Implementierung für das Crawling von Webseiten in Fusion) wird eine boolesche Datenquelleneigenschaft namens obeyRobots
definiert, die steuert, ob WebFetcher
beim Crawling von Webseiten die Richtlinien in robots.txt beachten soll (deaktivieren Sie diese Einstellung mit Vorsicht!). Felder mit @Property
Anmerkungen für Datenquelleneigenschaften sollten direkt in der Klasse Fetcher
selbst definiert werden. Das Attribut title=
einer @Property
Anmerkung wird von Fusion verwendet, um Datenquelleneigenschaften in der Benutzeroberfläche darzustellen.
Fehlerbehandlung
Und schließlich ist es wichtig zu wissen, dass fetch()
darf jede Java-Ausnahme auslösen. Ausnahmen werden aufbewahrt, gemeldet und vom Framework behandelt, einschließlich einer Logik, die entscheidet, wie oft fetch()
für ein bestimmtes Element nacheinander fehlschlagen muss, bevor dieses Element in Solr gelöscht wird. Die meisten Fetcher
-Implementierungen werden bestimmte Fehler abfangen und darauf reagieren wollen (z.B. Wiederholung fehlgeschlagener HTTP-Anfragen bei einem Web-Crawl), aber alle schwerwiegenden Fehler können einfach durch fetch()
auftauchen.
Was kommt als Nächstes?
Der Sweet Spot von Anda liegt derzeit definitiv in der schnellen und einfachen Entwicklung von Crawlern, die in der Regel etwas spezifischer sind als der Begriff „Connector“. Dass Objekte mit anderen Objekten verknüpft sind, ist derzeit eine Kernannahme des Anda-Frameworks. Webseiten haben Links zu anderen Webseiten und Dateisysteme haben Verzeichnisse, die auf andere Dateien verweisen, wodurch sich Strukturen ergeben, die eindeutig gecrawlt werden müssen.
Wir arbeiten daran, zusätzliche Ingestion-Paradigmen zu ermöglichen, wie z.B. die Iteration über Ergebnismengen (z.B. aus einer traditionellen Datenbank), anstatt Links zu folgen, um die Traversal zu definieren. Mechanismen, um Crawls auf diese Weise zu starten, sind ebenfalls in Entwicklung. Im Moment kann es sinnvoll sein, Konnektoren zu entwickeln, deren Ingestion-Paradigma weniger mit Crawling zu tun hat (z.B. die Slack- und JDBC-Konnektoren in Fusion), indem Sie das allgemeine Fusion-Konnektoren-Framework verwenden. Bleiben Sie dran für zukünftige Blog-Beiträge, die sich mit neuen Methoden für die Aufnahme von Inhalten und das Traversieren in Anda befassen.
Ein Anda SDK mit Beispielen und vollständiger Dokumentation ist ebenfalls in Arbeit. Dieser Blogbeitrag wird aktualisiert, sobald es verfügbar ist. Bitte kontaktieren Sie Lucidworks in der Zwischenzeit.
Zusätzliche Lektüre
Geplante kommende Blogbeiträge (Links werden veröffentlicht, sobald sie verfügbar sind):
Web Crawling in Fusion
Der von Anda betriebene Fusion Web Crawler bietet eine Reihe von Optionen, mit denen Sie steuern können, wie Webseiten gecrawlt und indiziert werden, wie schnell das Crawling erfolgt usw.
De-Duplizierung von Inhalten mit Anda
Die De-Duplizierung ähnlicher Inhalte ist eine komplexe, aber verallgemeinerbare Aufgabe, die wir im Anda-Framework in Angriff genommen haben, so dass sie jedem mit Anda entwickelten Crawler zur Verfügung steht.
Anda Crawler Development Deep-dive
Das Schreiben einer Fetcher
ist eine der beiden Möglichkeiten, Anda den Zugriff auf Ihre Daten zu ermöglichen. Es ist auch möglich, eine Schnittstelle namens FS
(kurz für Filesystem) zu implementieren. Welche Sie wählen, hängt vor allem davon ab, ob die Zieldatenquelle in Form eines Standard-Dateisystems modelliert werden kann. Wenn eine Datenquelle in der Regel mit Dateien und Verzeichnissen arbeitet, ist es möglicherweise einfacher, eine FS
zu schreiben als eine Fetcher
.