Das neue ‚bin/post‘-Dienstprogramm von Solr 5

Einführung in die Serie Dies ist der erste Teil einer dreiteiligen Serie, in der wir Ihnen zeigen, wie Sie mit…

Einführung in die Serie

Dies ist der erste Teil einer dreiteiligen Serie, in der wir Ihnen zeigen, wie Sie mit ein paar einfachen Befehlen eine echte Anwendung erstellen können. Die drei Teile dieser Serie sind:

Einführung von bin/post: ein in Solr 5 integriertes Werkzeug zur Indizierung von Daten

Am Anfang war die Befehlszeile… Im Rahmen der Verbesserungen der Benutzerfreundlichkeit von Solr 5 wurde das Tool bin/post entwickelt, mit dem Sie Daten und Dokumente noch einfacher indizieren können. Dieser Artikel veranschaulicht und erklärt, wie Sie dieses Tool verwenden können.

Solr-Veteranen (vor Version 5.0), die höchstwahrscheinlich das „Beispiel“ von Solr verwendet haben, werden mit post.jar vertraut sein, das Sie unter example/exampledocs finden. Vielleicht haben Sie es nur benutzt, wenn Sie Solr zum ersten Mal gestartet haben, um beispielsweise technische Produkte oder Buchdaten zu indizieren. Auch wenn Sie post.jar noch nicht verwendet haben, sollten Sie diese neue Schnittstelle einmal ausprobieren, und sei es nur, um gelegentlich administrative Befehle an Ihre Solr-Instanzen zu senden. Im Folgenden finden Sie einige interessante einfache Tricks, die Sie mit diesem Tool ausführen können.

Lassen Sie uns damit beginnen, Solr zu starten und eine Sammlung zu erstellen:

$ bin/solr start
$ bin/solr create -c solr_docs

Das Tool bin/post kann einen Verzeichnisbaum von Dateien indizieren, und die Solr-Distribution enthält ein praktisches docs/ Verzeichnis, um diese Fähigkeit zu demonstrieren:

$ bin/post -c solr_docs docs/

java -classpath /Users/erikhatcher/solr-5.3.0/dist/solr-core-5.3.0.jar -Dauto=yes -Dc=solr_docs -Ddata=files -Drecursive=yes org.apache.solr.util.SimplePostTool /Users/erikhatcher/solr-5.3.0/docs/
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/solr_docs/update...
Entering auto mode. File endings considered are xml,json,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log
Entering recursive mode, max depth=999, delay=0s
Indexing directory /Users/erikhatcher/solr-5.3.0/docs (3 files, depth=0)
.
.
.
3575 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/solr_docs/update...
Time spent: 0:00:30.705

30 Sekunden später ist das Verzeichnis docs/ von Solr indiziert und für die Suche verfügbar. Als Vorgeschmack auf den nächsten Beitrag in dieser Serie, sehen Sie sich http://localhost:8983/solr/solr_docs/browse?q=faceting an, um zu sehen, was Sie da haben. Gibt es irgendetwas, das bin/post tun kann, was cleveres Curlingnicht tun kann? Nichts, obwohl Sie für ganz vergleichbare Fähigkeiten über einen Verzeichnisbaum von Dateien iterieren oder das Web crawlen und die zu verfolgenden Links parsen müssten. bin/post soll die (Befehlszeilen-)Schnittstelle für viele gängige Solr-Ingestions- und Befehlsanforderungen vereinfachen.

Verwendung

Das Tool bietet solide -h Hilfe, wobei die abgekürzte Verwendungsangabe lautet:

$ bin/post -h
Usage: post -c <collection> [OPTIONS] <files|directories|urls|-d ["...",...]>
    or post -help

   collection name defaults to DEFAULT_SOLR_COLLECTION if not specified
...

In der vollständigen Ausgabe bin/post -h finden Sie weitere Einzelheiten zu den Parametern und Beispielen für die Verwendung. Eine Sammlung oder URL muss immer mit -c (oder durch DEFAULT_SOLR_COLLECTION in der Umgebung) oder -url angegeben werden. Es gibt Parameter zur Steuerung der Basis-URL von Solr mit -host, -port oder der vollständigen -url. Beachten Sie, dass es sich bei -url um die vollständige URL handeln muss, einschließlich des Kernnamens bis hin zum /update Handler, wie z.B. -url http://staging_server:8888/solr/core_name/update.

Indizierung von „Rich Documents“ aus dem Dateisystem oder Web Crawl

Die Indizierung des Dateisystems wurde oben demonstriert, indem das Verzeichnis docs/ von Solr indiziert wurde, das eine Menge HTML-Dateien enthält. Ein weiteres unterhaltsames Beispiel ist die Indizierung Ihres eigenen Dokumentenordners wie folgt:

$ bin/solr create -c my_docs
bin/post -c my_docs ~/Documents

Es gibt eine eingeschränkte Liste von Dateitypen (nach Dateierweiterung), die bin/post an Solr weitergibt und die anderen überspringt. bin/post -h liefert die standardmäßig verwendete Liste. Um z.B. eine .png-Datei zu indizieren, setzen Sie den Parameter -filetypes: bin/post -c test -filetypes png image.png. Um keine Dateien zu überspringen, verwenden Sie „*“ für die Einstellung filetypes: bin/post -c test -filetypes "*" docs/ (beachten Sie die doppelten Anführungszeichen um das Sternchen herum, sonst könnte Ihre Shell dies zu einer Liste von Dateien erweitern und nicht wie beabsichtigt funktionieren) Durchsuchen Sie Ihre eigenen Dokumente unter http://localhost:8983/solr/my_docs/browse

Rudimentäres Webcrawlen

Vorsicht: Das Crawlen von Websites ist keine triviale Aufgabe, die man gut erledigen kann. Das Web-Crawling von bin/post ist sehr grundlegend, single-threaded und nicht für ernsthafte Geschäfte gedacht. Aber es macht Spaß, eine einfache Website relativ schnell zu indizieren und ein Gefühl dafür zu bekommen, mit welchen Problemen bei der Verarbeitung von Inhalten und der Abfrage von Daten zu rechnen ist, wenn ein Crawler im Produktionsmaßstab oder andere Mittel zur Erfassung von Inhalten in Arbeit sind:

$ bin/solr create -c site
$ bin/post -c site https://lucidworks.com -recursive 2 -delay 1  # (this will take some minutes)

Beim Web-Crawling gelten dieselben Inhalts-/Dateityp-Filter wie beim oben erwähnten Dateicrawling; verwenden Sie -filetypes nach Bedarf. Probieren Sie auch hier /browse aus; für dieses Beispiel verwenden Sie http://localhost:8983/solr/site/browse?q=revolution

Indizierung von CSV-Dateien (spaltengetrennt)

Die Indizierung von CSV-Dateien könnte nicht einfacher sein! Es geht einfach so: data.csv ist eine Standard-CSV-Datei:

$ bin/post -c collection_name data.csv

CSV-Dateien werden an den /update Handler mit dem Inhaltstyp „text/csv“ übergeben. Er erkennt, dass es sich um eine CSV-Datei handelt, und zwar anhand der Dateierweiterung „.csv“. Da die Dateierweiterung zur Auswahl des Inhaltstyps herangezogen wird und es derzeit nur eine feste „.csv“-Zuordnung zu text/csv gibt, müssen Sie den Inhalt -type ausdrücklich so einstellen, wenn die Datei eine andere Erweiterung hat:

$ bin/post -c collection_name -type text/csv data.file

Wenn die durch Trennzeichen getrennte Datei keine erste Zeile mit Spaltennamen enthält, einige Spalten ausgeschlossen oder Namen zugeordnet werden müssen, die Datei durch Tabulatoren und nicht durch Kommas getrennt ist oder Sie eine der verschiedenen Optionen für den CSV-Handler angeben müssen, kann die Option -params verwendet werden. Um zum Beispiel eine tabulatorgetrennte Datei zu indizieren, setzen Sie den Parameter separator wie folgt:

$ bin/post -c collection_name data.tsv -type text/csv -params "separator=%09"

Die in -params angegebenen Schlüssel=Wert-Paare müssen URL-kodiert und durch kaufmännische Zeichen getrennt sein (Tabulator ist URL-kodiert als %09). Wenn die erste Zeile einer CSV-Datei aus Daten und nicht aus Spaltennamen besteht oder Sie die Spaltennamen überschreiben müssen, können Sie den Parameter fieldnames angeben und header=true setzen, wenn die erste Zeile ignoriert werden soll:

$ bin/post -c collection_name data.csv -params "fieldnames=id,foo&header=true"

Hier ist ein netter Trick, den Sie mit CSV-Daten anwenden können: Fügen Sie eine „Datenquelle“ oder eine Art Feld hinzu, um zu identifizieren, aus welcher Datei oder welchem Datensatz jedes Dokument stammt. Fügen Sie einen literal.<field_name>= Parameter wie diesen hinzu:

$ bin/post -c collection_name data.csv -params "literal.data_source=temp"

Wenn Ihr Schema ein data_source-Feld für Dokumente zulässt, wird jede Datei oder jede Gruppe von Dateien, die Sie laden, mit einem Schema Ihrer Wahl versehen, so dass Sie diese Teilmenge von Daten leicht filtern, löschen und bearbeiten können. Ein anderer wörtlicher Feldname könnte der Dateiname selbst sein. Achten Sie nur darauf, dass die geladene Datei mit dem Wert des Feldes übereinstimmt (es ist leicht, einen Teil der Befehlszeile zu ändern, nicht aber einen anderen, der synchron gehalten werden sollte).

Indizierung von JSON

Wenn Ihre Daten im Solr JSON-Format vorliegen, ist es einfach bin/post -c collection_name data.json. Beliebige JSON-Daten, die nicht von Solr stammen, können ebenfalls gemappt werden. Unter Verwendung der Prüfungsdaten und des Beispiels von hier können die Aufteilungs- und Zuordnungsparameter wie folgt angegeben werden:

$ bin/post -c collection_name grades.json -params "split=/exams&f=first:/first&f=last:/last&f=grade:/grade&f=subject:/exams/subject&f=test:/exams/test&f=marks:/exams/marks&json.command=false"

Beachten Sie, dass json.command=false angegeben werden musste, damit das JSON als Daten und nicht als potenzielle Solr-Befehle interpretiert wird.

Indizierung von Solr XML

Das gute alte Solr XML, kinderleicht: bin/post -c collection_name example/exampledocs/*.xml. Wenn Sie nicht wissen, was Solr XML ist, werfen Sie einen Blick auf die Solr Beispiel/exampledocs/*.xml Dateien. Leider gibt es derzeit keine Splitting- und Mapping-Funktionen für beliebiges XML mit bin/postVerwenden Sie den Data Import Handler mit dem XPathEntityProcessor, um dies zu erreichen. Siehe SOLR-6559 für weitere Informationen zu dieser zukünftigen Verbesserung.

Senden von Befehlen an Solr

Neben der Indizierung von Dokumenten, bin/post kann auch verwendet werden, um Solr Befehle zu erteilen. Hier sind einige Beispiele:

  • Übertragen: bin/post -c collection_name -out yes -type application/json -d '{commit:{}}' Hinweis: Für eine einfache Übergabe ist eigentlich keine Daten-/Befehlszeichenfolge erforderlich. Ein leeres, nachgestelltes -d reicht aus, um eine Übergabe zu erzwingen, etwa so – bin/post -c collection_name -d
  • Löschen Sie ein Dokument nach ID: bin/post -c collection_name -type application/json -out yes -d '{delete: {id: 1}}'
  • Dokumente nach Abfrage löschen: bin/post -c test -type application/json -out yes -d '{delete: {query: "data_source:temp"}}'

-out yes gibt den HTTP-Antwortkörper der Solr-Anfrage wieder, was im Allgemeinen bei Indizierungsfehlern nicht weiter hilfreich ist, aber bei Befehlen wie commit und delete auch bei Erfolg gut zu sehen ist. Befehle oder sogar Dokumente können durch bin/post geleitet werden, wenn -d am Ende der Befehlszeile hängt:

# Pipe a commit command
$ echo '{commit: {}}' | bin/post -c collection_name -type application/json -out yes -d

# Pipe and index a CSV file
$ cat data.csv | bin/post -c collection_name -type text/csv -d

Innenleben der Tonne/Post

Die bin/post Tool ist ein einfaches Unix-Shell-Skript, das Befehlszeilenargumente verarbeitet und validiert und ein Java-Programm startet, das die Datei(en) an den entsprechenden Update-Handler-Endpunkt sendet. Derzeit ist SimplePostTool die Java-Klasse, die diese Arbeit erledigt (der Kern des berüchtigten post.jar von früher). Tatsächlich existiert post.jar noch und wird unter bin/post verwendet, aber das ist ein Implementierungsdetail, das bin/post verbergen soll. SimplePostTool (nicht das Wrapper-Skript bin/post) verwendet die Dateierweiterungen, um den Solr-Endpunkt zu bestimmen, der für jeden POST verwendet werden soll. Es gibt drei spezielle Dateitypen, die an den /update-Endpunkt von Solr gepostet werden: .json, .csv und .xml. Alle anderen Dateierweiterungen werden an den Endpunkt URL+/extract gesendet, der eine Vielzahl von Dateitypen analysiert. Wenn Sie CSV-, XML- oder JSON-Daten indizieren und die Dateierweiterung nicht übereinstimmt oder es sich nicht um eine Datei handelt (wenn Sie die Option -d verwenden), müssen Sie -type explizit auf text/csv, application/xml oder application/json einstellen.

Dumme Mülltonnen-/Posttricks

Introspect Rich Document Parsing und Extraktion

Möchten Sie sehen, wie das Rich Document Parsing von Solr Ihre Dateien sieht? Das ist keine neue Funktion, aber eine nette, die Sie über bin/post nutzen können, indem Sie ein Dokument im Debug-Modus an den Extract-Handler senden und eine XHTML-Ansicht des Dokuments mit allen Metadaten zurückgeben. Hier ist ein Beispiel mit der Einstellung -params und einigen zusätzlichen Einstellungen, die weiter unten erläutert werden:

$ bin/post -c test -params "extractOnly=true&wt=ruby&indent=yes" -out yes docs/SYSTEM_REQUIREMENTS.html
java -classpath /Users/erikhatcher/solr-5.3.0/dist/solr-core-5.3.0.jar -Dauto=yes -Dparams=extractOnly=true&wt=ruby&indent=yes -Dout=yes -Dc=test -Ddata=files org.apache.solr.util.SimplePostTool /Users/erikhatcher/solr-5.3.0/docs/SYSTEM_REQUIREMENTS.html
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/test/update?extractOnly=true&wt=ruby&indent=yes...
Entering auto mode. File endings considered are xml,json,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log
POSTing file SYSTEM_REQUIREMENTS.html (text/html) to [base]/extract
{
  'responseHeader'=>{
    'status'=>0,
    'QTime'=>3},
  ''=>'<?xml version="1.0" encoding="UTF-8"?>
<html >
<head>
<meta
name="stream_size" content="1100"/>
<meta name="X-Parsed-By"
            content="org.apache.tika.parser.DefaultParser"/>
<meta
name="X-Parsed-By"
            content="org.apache.tika.parser.html.HtmlParser"/>
<meta
name="stream_content_type" content="text/html"/>
<meta name="dc:title"
            content="System Requirements"/>
<meta
name="Content-Encoding" content="UTF-8"/>
<meta name="resourceName"
            content="/Users/erikhatcher/solr-5.2.0/docs/SYSTEM_REQUIREMENTS.html"/>
<meta
name="Content-Type"
                content="text/html; charset=UTF-8"/>
<title>System Requirements</title>
</head>
<body>
<h1>System Requirements</h1>
   ...
</body>
</html>
',
  'null_metadata'=>[
    'stream_size',['1100'],
    'X-Parsed-By',['org.apache.tika.parser.DefaultParser',
      'org.apache.tika.parser.html.HtmlParser'],
    'stream_content_type',['text/html'],
    'dc:title',['System Requirements'],
    'Content-Encoding',['UTF-8'],
    'resourceName',['/Users/erikhatcher/solr-5.3.0/docs/SYSTEM_REQUIREMENTS.html'],
    'title',['System Requirements'],
    'Content-Type',['text/html; charset=UTF-8']]}
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/test/update?extractOnly=true&wt=ruby&indent=yes...
Time spent: 0:00:00.027

Die Einstellung extractOnly=true weist den extract handler an, die strukturierten geparsten Informationen zurückzugeben, anstatt das Dokument tatsächlich zu indizieren. Durch die Einstellung wt=ruby (ah ja! Probieren Sie es ruhig in json oder xml aus 🙂 und indent=yes wird die Ausgabe (geben Sie unbedingt -out yes an!) in einer Konsole lesbar dargestellt.

Prototyping, Fehlersuche, Basteln, Demonstrieren

Es ist wirklich praktisch, wenn man eine Funktion von Solr testen und demonstrieren kann, indem man „das Einfachste tut, was funktioniert“ und bin/post macht dies zu einer wahren Freude. Hier sind einige Beispiele –

Passt es?

Mit dieser Technik können Sie auf einfache Weise Daten indizieren und schnell sehen, wie Abfragen mit ihnen funktionieren. Erstellen Sie einen „Spielplatz“-Index und stellen Sie ein einzelnes Dokument mit den Feldern id, description und value ein:

$ bin/solr create -c playground
$ bin/post -c playground -type text/csv -out yes -d $'id,description,valuen,are we there yet?,0.42'

Unix-Hinweis: Das Dollar-Zeichen vor der CSV-Zeichenfolge in einfachen Anführungszeichen ist wichtig, damit die Zeilenumbrüche ordnungsgemäß verarbeitet werden können. Sie können aber auch die gleichen Daten posten, indem Sie die Feldnamen in einen separaten Parameter mit bin/post -c playground -type text/csv -out yes -params "fieldnames=id,description,value" -d '1,are we there yet?,0.42' eingeben und so die Notwendigkeit eines Zeilenumbruchs und das damit verbundene Problem vermeiden.

Stimmt es mit einer Fuzzy-Abfrage überein? their~, in der /select-Anfrage unten, ist buchstäblich eine FuzzyQuery und endet mit dem indizierten Dokument (basierend auf der Unschärfe der String-Edit-Distanz), rows=0, so dass wir nur die numFound- und debug=query-Ausgabe sehen:

$ curl 'http://localhost:8983/solr/playground/select?q=their~&wt=ruby&indent=on&rows=0&debug=query'
{
  'responseHeader'=>{
    'status'=>0,
    'QTime'=>0,
    'params'=>{
      'q'=>'their~',
      'debug'=>'query',
      'indent'=>'on',
      'rows'=>'0',
      'wt'=>'ruby'}},
    'response'=>{'numFound'=>1,'start'=>0,'docs'=>[]
  },
  'debug'=>{
    'rawquerystring'=>'their~',
    'querystring'=>'their~',
    'parsedquery'=>'_text_:their~2',
    'parsedquery_toString'=>'_text_:their~2',
    'QParser'=>'LuceneQParser'}}

Verwenden Sie einfach ein id-Feld und alle Felder, die in Ihren Testabfragen vorkommen. So erhalten Sie schnell einen Einblick in die Indizierung von Dokumenten, die Analyse von Text und die Übereinstimmung von Abfragen. Mit diesem CSV-Trick können Sie eine Vielzahl von Szenarien testen, einschließlich komplexer Facettierung, Gruppierung, Hervorhebung usw., und das oft mit nur wenigen repräsentativen CSV-Daten.

Windows, es tut mir leid. Aber verzweifeln Sie nicht.

bin/post ist ein Unix-Shell-Skript. Es gibt keine vergleichbare Windows-Befehlsdatei, wie es sie für bin/solr gibt. Der Entwickler von bin/post ist ein grauhaariger Unix-Muffel und sagt spöttisch „Patches willkommen“, wenn er gefragt wird, wo die Windows-Version ist. Aber verzweifeln Sie nicht, bevor es bin/post gab, gab es post.jar. Und es gibt immer noch post.jar. Im Abschnitt “ Windows-Unterstützung“ des Referenzhandbuchs finden Sie Einzelheiten dazu, wie Sie das Äquivalent zu allem, was bin/post kann, ausführen können, aber mit den obigen Beispielen ist es ein schnelles Kopieren/Einfügen, um loszulegen. Das Tool bin/post gibt die Java-Befehlszeile wieder, kurz bevor es gestartet wird, so dass Sie die obigen Beispiele einfach kopieren/einfügen/anpassen können. Um zum Beispiel die solr_docs aus dem ersten Beispiel zu posten, nehmen Sie die Zeile „java -classpath ….“ und passen sie an die Windows-Pfade an:

> java -classpath <path to Solr>distsolr-core-5.3.0.jar -Dauto=yes -Dc=solr_docs -Ddata=files -Drecursive=yes 
  org.apache.solr.util.SimplePostTool <path to Solr>docs

Zukunft

Was will man mehr von einem Tool, mit dem man Inhalte in Solr veröffentlichen kann? Eine ganze Menge, wie sich herausstellt! Hier sind ein paar Ideen für Verbesserungen:

  • Zunächst einmal wird SolrCloud-Unterstützung benötigt. Im Moment ist der exakte HTTP-Endpunkt erforderlich, während die SolrCloud-Indizierung am besten mit ZooKeeper-Cluster und der Kenntnis der Sammlungstopologie erfolgt. Vielleicht passt dies unter SOLR-7268.
  • SOLR-7057: Bessere Erkennung und Behandlung von Inhaltstypen (.tsv-Dateien könnten automatisch als mit separator=%09 getrennt betrachtet werden)
  • SOLR-6994: Hinzufügen einer vergleichbaren Windows-Befehlszeilenschnittstelle
  • SOLR-7042: Verbessern Sie den Umgang von bin/post mit beliebigem JSON
  • SOLR-7188: Und vielleicht, nur vielleicht, könnte dieses Tool auch das Front-End für den Client-seitigen Data Import Handler sein

Und zweifellos gibt es zahlreiche weitere Verbesserungen, um die Befehlszeilensyntax und die Robustheit dieses praktischen kleinen Tools zu verbessern.

Fazit

$ bin/post -c your_collection your_data/

Nein, bin/post ist nicht unbedingt der „richtige“ Weg, um Daten in Ihr System zu bekommen, wenn es um Streaming Spark-Jobs, Datenbankinhalte, umfangreiches Web-Crawling oder andere Solr-Integrationskonnektoren geht. Aber aus pragmatischer Sicht ist es vielleicht genau das Richtige, um Befehle zum Übertragen/Löschen an einen Ihrer Solr-Server zu senden oder um einige schnelle Tests durchzuführen. Und wenn Sie z.B. einen nächtlichen Prozess haben, der neue Daten als CSV-Dateien erzeugt, wäre ein Cron-Job für bin/post genauso pragmatisch und „produktionstauglich“ wie alles andere.

Der nächste Schritt…

Mit bin/post haben Sie Ihre Daten mit einem einfachen, leicht zu bedienenden Befehl in Solr übertragen. Das ist ein wichtiger Schritt, wenn auch nur die Hälfte der Gleichung. Wir indizieren Inhalte, damit wir sie abfragen, analysieren und visualisieren können. Der nächste Artikel in dieser Serie befasst sich mit den Funktionen von Solr zur Erstellung von Antwortvorlagen, die eine typische (und erweiterbare) Benutzeroberfläche für Suchergebnisse bieten.

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