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.

Fusion herunterladen

Zusätzliche Lektüre

Fusion Anda Dokumentation

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.

You Might Also Like

Vom Suchunternehmen zum praktischen KI-Pionier: Unsere Vision für 2025 und darüber hinaus

CEO Mike Sinoway gibt Einblicke in die Zukunft der KI und stellt...

Read More

Wenn KI schief geht: Fehlschläge in der realen Welt und wie man sie vermeidet

Lassen Sie nicht zu, dass Ihr KI-Chatbot einen 50.000 Dollar teuren Tahoe...

Read More

Lucidworks Kernpakete: Branchenoptimierte KI-Such- und Personalisierungslösungen

Entdecken Sie unsere umfassenden Core Packages, die Analytics Studio, Commerce Studio und...

Read More

Quick Links