Was ist Apache Solr? Und warum sollten Sie es verwenden

Apache Solr ist ein Teilprojekt von Apache Lucene, der Indizierungstechnologie hinter der zuletzt erstellten Such- und Indextechnologie. Solr ist im Herzen eine Suchmaschine, aber es ist viel mehr als das. Es ist eine NoSQL-Datenbank mit Transaktionsunterstützung. Es handelt sich um eine Dokumentendatenbank, die SQL-Unterstützung bietet und diese verteilt ausführt.

Hört sich interessant an? Komm zu mir für einen genaueren Blick. (Vollständige Offenlegung: Ich arbeite für Lucidworks, das viele der wichtigsten Mitarbeiter des Solr-Projekts beschäftigt.)

Sie benötigen einen anständigen Computer (oder verwenden Sie einfach eine AWS-Instanz) mit idealerweise 8 GB oder mehr RAM. Sie finden Solr unter //lucene.apache.org/solr. Sie benötigen auch die Java Virtual Machine Version 8. Entpacken / entpacken Sie Solr in ein Verzeichnis, stellen Sie sicher, dass JAVA_HOME festgelegt ist und dass sich die Java-Binärdatei in Ihrem Pfad befindet. Wechseln Sie in das Verzeichnis, in dem sich Solr befindet, und geben Sie ein bin/solr start -e cloud -noprompt. Dadurch wird ein Cluster mit zwei Knoten auf Ihrem Laptop mit einer Beispielsammlung namens "Gettingstarted" gestartet, die bereits geladen ist.

Ein normaler Start wäre nur bin/solr start -c, Solr im Cloud-Modus zu starten. Aber wenn Sie die Reifen treten wollen, möchten Sie wirklich eine Installation mit mehreren Knoten sehen, selbst wenn diese auf Ihrem eigenen Laptop installiert ist. Mit Solr Cloud möchten Sie eine moderne Solr-Installation ausführen. Wenn Sie ohne das -cstarten, starten Sie im Legacy-Modus. Das ist eine schlechte Sache.

Dokumente und Sammlungen

Solr ist eine dokumentenstrukturierte Datenbank. Entitäten wie "Person" bestehen aus Feldern wie Name, Adresse und E-Mail. Diese Dokumente werden in Sammlungen gespeichert. Sammlungen sind den Tabellen in einer relationalen Datenbank am nächsten. Im Gegensatz zu einer relationalen Datenbank kann "Person" die Entität jedoch vollständig enthalten. Wenn eine Person mehrere Adressen hat, können diese Adressen in einem "Person" -Dokument gespeichert werden. In einer relationalen Datenbank benötigen Sie eine separate Adresstabelle.

Person {

 "Id": "1333425",

 "Vorname": "Francis",

 "Zweiter Vorname": "J.",

 "Nachname": "Underwood",

 "Adresse": ["1600 Pennsylvania Ave NW, Washington, DC 20500", "1609 Far St. NW, Washington, DC, 20036"],

 "Telefon": ["202-456-1111", "202-456-1414"]

}}

Scherben, Repliken und Kerne

Im Gegensatz zu den meisten relationalen Datenbanken werden Daten automatisch über Solr Cloud übertragen und repliziert. Dies bedeutet, dass ein Dokument, wenn Sie es in eine ordnungsgemäß konfigurierte Sammlung schreiben, an eine der Solr-Instanzen verteilt wird. Das ist "Scherben". Dies dient zur Verbesserung der Leseleistung. Jedes Dokument wird aus Redundanzgründen mindestens einmal repliziert oder kopiert (konfigurierbar). Dies bedeutet, dass Sie eine Solr-Instanz verlieren und nur eine verringerte Leistung in Ihrem Cluster erleiden können, jedoch keinen Datenverlust.

Ein Cluster besteht aus einer Reihe von „Knoten“, bei denen es sich um JVM-Instanzen (Java Virtual Machine) handelt, auf denen Solr ausgeführt wird. Ein Knoten kann mehrere "Kerne" enthalten. Jeder Kern ist eine Nachbildung eines logischen "Shards". Im Allgemeinen werden Kerne durch die Sammlung, die Shard-Nummer und die Replikatnummer identifiziert, die als Zeichenfolge miteinander verknüpft sind.

Eine Sammlung erstellen

Obwohl es REST-ähnliche HTTP-Schnittstellen gibt, können Sie mit dem Befehl bin/solr(oder bin/solr.cmd) Sammlungen erstellen und steuern. Verwenden wir ein nicht kontroverses Thema und suchen einen öffentlichen Datensatz. Holen Sie sich eine Kopie der Kostendaten für das Gesundheitswesen von Data.gov. Nehmen Sie es der Einfachheit halber als CSV. Angenommen, Sie haben Solr wie angegeben gestartet, verwenden Sie diesen Befehl, um eine Sammlung mit dem Namen ipps zu erstellen:

bin / solr create_collection -d basic_configs -c ipps

Als nächstes laden wir Daten in die Sammlung. Zuerst müssen wir einige Dinge in der CSV-Datei korrigieren. Entfernen Sie alle $Zeichen. Ändern Sie außerdem in der oberen Reihe der Feldnamen die Felder von Leerzeichen in Unterstriche. Lass es so lesen:

DRG_Definition, Provider_Id, Provider_Name, Provider_Street_Address, Provider_City, Provider_State, Provider_Zip_Code, Hospital_Referral_Region_Description, Total_Discharges, Average_Covered_Charges, Average_Total_Payments, Average_Total_Payments

Es gibt leistungsfähigere Tools für ETL als die in Solr integrierten (wie das, das in das Produkt integriert ist, das mein Unternehmen verkauft), aber insgesamt war dies keine komplizierte Lösung!

Bevor wir jedoch Daten laden, müssen wir ein „Schema“ erstellen, das dem in einer relationalen Datenbank ähnelt. Wir können das mit dem curlBefehl unter Linux / Mac tun oder Sie können ein GUI-Tool wie Postman verwenden.

curl -X POST -H 'Inhaltstyp: application / json' —data-binary '{

 "Feld hinzufügen":{

     "Name": "DRG_Definition",

     "Typ": "text_general",

     "Indiziert": wahr,

     "Gespeichert": wahr

  },

 "Feld hinzufügen":{

     "Name": "Provider_Id",

     "Typ": "plong",

     "DocValues": wahr,

     "Indiziert": wahr,

     "Gespeichert": wahr

  },

 "Feld hinzufügen":{

     "Name": "Provider_Name",

     "Typ": "text_general",

     "Indiziert": wahr,

     "Gespeichert": wahr

  },

 "Feld hinzufügen":{

     "Name": "Provider_Street_Address",

     "Typ": "Zeichenfolge",

     "Indiziert": falsch,

     "Gespeichert": wahr

  },

 "Feld hinzufügen":{

     "Name": "Provider_City",

     "Typ": "Zeichenfolge",

     "Indiziert": wahr,

     "Gespeichert": wahr

  },

 "Feld hinzufügen":{

     "Name": "Provider_State",

     "Typ": "Zeichenfolge",

     "Indiziert": wahr,

     "Gespeichert": wahr

  },

 "Feld hinzufügen":{

     "Name": "Provider_Zip_Code",

     "Typ": "Zeichenfolge",

     "Indiziert": wahr,

     "Gespeichert": wahr

  },

 "Feld hinzufügen":{

     "Name": "Hospital_Referral_Region_Description",

     "Typ": "text_general",

     "Indiziert": wahr,

     "Gespeichert": wahr

  },

 "Feld hinzufügen":{

     "Name": "Total_Discharges",

     "Typ": "Pint",

     "DocValues": wahr,

     "Indiziert": wahr,

     "Gespeichert": wahr

  },

 "Feld hinzufügen":{

     "Name": "Average_Covered_Charges",

     "Typ": "pdouble",

     "DocValues": wahr,

     "Indiziert": wahr,

     "Gespeichert": wahr

  },

 "Feld hinzufügen":{

     "Name": "Average_Total_Payments",

     "Typ": "pdouble",

     "DocValues": wahr,

     "Indiziert": wahr,

     "Gespeichert": wahr

  },

 "Feld hinzufügen":{

     "Name": "Average_Medicare_Payments",

     "Typ": "pdouble",

     "DocValues": wahr,

     "Indiziert": wahr,

     "Gespeichert": wahr

  }}

} '// localhost: 8983 / solr / ipps / schema

Dies sind Feldnamen, Feldtypen und ob das Feld indiziert und gespeichert werden soll oder nicht. Weitere Informationen zu den Datentypen und dem Gesamtschema von Solr finden Sie im Referenzhandbuch.

Now that we’ve got a schema we can “post” the data into Solr. There are many routes to do this. You could use curl or Postman, but Solr includes a command line tool, bin/post, which will be available out of the box on Linux and MacOS.

bin/post -c ipps -params "rowid=id" -type "text/csv" /home/acoliver/Downloads/Inpatient_Prospective_Payment_System__IPPS__Provider_Summary_for_the_Top_100_Diagnosis-Related_Groups__DRG__-_FY2011.csv

On Windows:

java -Dtype=text/csv -Dc=ipps -Dparams="rowid=id" -jar example\exampledocs\post.jar \Users\acoliver\Downloads\Inpatient_Prospective_Payment_System__IPPS__Provider_Summary_for_the_Top_100_Diagnosis-Related_Groups__DRG__-_FY2011.csv

W00t you have data!

Querying your data

There are language bindings for Solr that you can use for Java or Python, or if you’re more of a power developer you can use the one for PHP. Or you could just use curl or Postman or your browser.

Paste this into an address bar:

//localhost:8983/solr/ipps/select?indent=on&q=*:*&wt=json

This URL is a simple query that returns the 10 most relevant results. You can change the pagination and find out more about Solr’s Solr’s query language and even alternative query parsers in the reference guide. If you want to see the same thing in XML you can configure that.

Maybe you want to do something a bit more advanced. Below finds procedures in the town I live in:

//localhost:8983/solr/ipps/select?indent=on&q=Provider_State:NC%20AND%20Hospital_Referral_Region_Description:%22*Durham%22&wt=json

You can go much further and do more summaries and calculations and fuzzy matches.

Solr administration

Some of you are like “Good gosh, the command line scares me!” So that’s fine, Solr has a GUI. Got to //localhost:8983/solr and see this beauty:

If you select your collection on the side, you can even go to a screen that will let you fill in query parameters:

If that screen gives you a headache, you can just go to //localhost:8983/solr/ipps/browse.

We’ve done simple text queries. You can also do ranges and spatial searches. If the “relevance” sorting isn’t working for you, you can do more advanced expressions and have Solr return things “as they are found” much like an RDBMS does it. You can sort on various fields and filter by categories. You can even have it “learn to rank”—a machine learning capability that lets Solr “learn” what users think is the most relevant result. We’ve really only scratched the surface.

Why Solr?

So clearly you might choose to use Solr if you need a search engine. However, it is also a redundant, distributed document database that offers SQL (out of the box) for those who want to connect tools like Tableau. It is extensible in Java (and other JVM languages), and yet with the REST-like interface you can easily speak JSON or XML to it.

Solr ist möglicherweise nicht die beste Wahl, wenn Sie einfache Daten haben, die Sie anhand des Schlüssels nachschlagen und hauptsächlich schreiben. Solr hat zu viel Wasser für größere Dinge, um dafür so effizient zu sein wie ein Geschäft mit Schlüsselwerten.

Solr ist eine klare Wahl, wenn Ihre Suche sehr textorientiert ist. Es gibt jedoch auch andere nicht so offensichtliche Fälle, in denen dies eine gute Wahl sein könnte, beispielsweise für die räumliche Suche bei all jenen Personen, deren Handys Sie gehackt haben, um ihren Standort zu verfolgen. Ich sage nur, dass Sie, Herr Putin, vielleicht auch Solr wählen möchten.

Denken Sie jedoch daran, dass Freunde keine SQL- bla like '%stuff' Abfragen zulassen .