Cos'è Apache Solr? E perché dovresti usarlo

Apache Solr è un sottoprogetto di Apache Lucene, la tecnologia di indicizzazione alla base della più recente tecnologia di ricerca e indicizzazione. Solr è un motore di ricerca in fondo, ma è molto di più. È un database NoSQL con supporto transazionale. È un database di documenti che offre supporto SQL e lo esegue in modo distribuito.

Sembra interessante? Unisciti a me per uno sguardo più da vicino. (Divulgazione completa: lavoro per Lucidworks, che impiega molti dei contributori chiave al progetto Solr.)

Hai bisogno di una macchina decente (o usa semplicemente un'istanza AWS) con idealmente 8 GB o più RAM. Puoi trovare Solr su //lucene.apache.org/solr. È inoltre necessaria la Java Virtual Machine versione 8. Decomprimere / untar Solr in una directory, assicurarsi che JAVA_HOME sia impostato e che il binario java sia nel percorso. Passare alla directory in cui si trova Solr e digitare bin/solr start -e cloud -noprompt. Questo avvia un cluster a due nodi sul tuo laptop con una raccolta di campioni chiamata getstarted già caricata.

Un avvio normale sarebbe solo quello bin/solr start -cdi avviare Solr in modalità "cloud". Ma se hai intenzione di dare calci alle gomme, vuoi davvero vedere un'installazione multi-nodo anche se è sul tuo laptop. Solr Cloud è il modo in cui desideri eseguire una moderna installazione di Solr. Se inizi senza -c, inizierai in modalità legacy. Questa è una brutta cosa.

Documenti e collezioni

Solr è un database strutturato in documenti. Le entità come "Persona" sono composte da campi come nome, indirizzo ed email. Questi documenti sono archiviati in raccolte. Le raccolte sono l'analogo più vicino alle tabelle in un database relazionale. Tuttavia, a differenza di un database relazionale, "Persona" può contenere completamente l'entità, il che significa che se una persona ha più indirizzi, tali indirizzi possono essere memorizzati in un documento "Persona". In un database relazionale avresti bisogno di una tabella di indirizzi separata.

Persona {

 "Id": "1333425",

 "First_name": "Francis",

 "Middle_name": "J.",

 "Last_name": "Underwood",

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

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

}

Frammenti, repliche e core

A differenza della maggior parte dei database relazionali, i dati vengono automaticamente suddivisi e replicati tramite Solr Cloud. Ciò significa che quando si scrive un documento in una raccolta configurata correttamente, viene distribuito a una delle istanze di Solr. Questo è "sharding". Viene fatto per migliorare le prestazioni di lettura. Ogni documento viene inoltre replicato o copiato almeno una volta (configurabile) per ridondanza. Ciò significa che puoi perdere un'istanza Solr e subire solo una riduzione delle prestazioni nel tuo cluster, ma nessuna perdita di dati.

Un cluster è un insieme di "nodi", che sono istanze di Java Virtual Machine (JVM) che eseguono Solr. Un nodo può contenere più "core". Ogni core è una replica di un "frammento" logico. Generalmente i core sono identificati dalla raccolta, dal numero di frammento e dal numero di replica concatenati insieme come una stringa.

Creazione di una raccolta

Sebbene ci siano interfacce HTTP simili a REST, puoi semplicemente usare il comando bin/solr(o bin/solr.cmd) per creare e controllare le raccolte. Usiamo un argomento non controverso e troviamo un set di dati pubblico. Prendi una copia dei dati sui costi sanitari da Data.gov. Per semplicità, prendilo come CSV. Supponendo che tu abbia avviato Solr come indicato, usa questo comando per creare una raccolta chiamata ipps:

bin / solr create_collection -d basic_configs -c ipps

Quindi carichiamo i dati nella raccolta. Per prima cosa dobbiamo correggere alcune cose nel file CSV. Rimuovi tutti i $personaggi. Inoltre, nella riga superiore dei nomi dei campi, modifica i campi da spazi a trattini bassi. Fallo leggere in questo modo:

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_Payments

Esistono strumenti più potenti per ETL di quelli incorporati in Solr (come quello integrato nel prodotto che la mia azienda vende), ma nel complesso non è stata una soluzione complicata!

Prima di caricare qualsiasi dato, però, dobbiamo creare uno "schema" simile a quello che hai in un database relazionale. Possiamo farlo con il curlcomando su Linux / Mac oppure puoi usare uno strumento GUI come Postman.

curl -X POST -H "Content-type: application / json" —data-binary "{

 "Add-field": {

     "Name": "DRG_Definition",

     "Type": "text_general",

     "Indicizzato": vero,

     "Memorizzato": vero

  },

 "Add-field": {

     "Name": "Provider_Id",

     "Type": "plong",

     "DocValues": true,

     "Indicizzato": vero,

     "Memorizzato": vero

  },

 "Add-field": {

     "Name": "Provider_Name",

     "Type": "text_general",

     "Indicizzato": vero,

     "Memorizzato": vero

  },

 "Add-field": {

     "Name": "Provider_Street_Address",

     "Tipo": "stringa",

     "Indicizzato": falso,

     "Memorizzato": vero

  },

 "Add-field": {

     "Name": "Provider_City",

     "Tipo": "stringa",

     "Indicizzato": vero,

     "Memorizzato": vero

  },

 "Add-field": {

     "Name": "Provider_State",

     "Tipo": "stringa",

     "Indicizzato": vero,

     "Memorizzato": vero

  },

 "Add-field": {

     "Name": "Provider_Zip_Code",

     "Tipo": "stringa",

     "Indicizzato": vero,

     "Memorizzato": vero

  },

 "Add-field": {

     "Name": "Hospital_Referral_Region_Description",

     "Type": "text_general",

     "Indicizzato": vero,

     "Memorizzato": vero

  },

 "Add-field": {

     "Name": "Total_Discharges",

     "Type": "pint",

     "DocValues": true,

     "Indicizzato": vero,

     "Memorizzato": vero

  },

 "Add-field": {

     "Name": "Average_Covered_Charges",

     "Type": "pdouble",

     "DocValues": true,

     "Indicizzato": vero,

     "Memorizzato": vero

  },

 "Add-field": {

     "Name": "Average_Total_Payments",

     "Type": "pdouble",

     "DocValues": true,

     "Indicizzato": vero,

     "Memorizzato": vero

  },

 "Add-field": {

     "Name": "Average_Medicare_Payments",

     "Type": "pdouble",

     "DocValues": true,

     "Indicizzato": vero,

     "Memorizzato": vero

  }

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

Questi sono i nomi dei campi, i tipi di campo e se indicizzare e memorizzare il campo. Puoi trovare ulteriori informazioni sui tipi di dati di Solr e sullo schema generale nella guida di riferimento.

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 potrebbe non essere la scelta migliore se hai dati semplici che stai cercando per chiave e su cui stai principalmente scrivendo. Solr ha troppe tubature per fare cose più grandi per essere efficiente quanto un archivio di valori-chiave.

Solr è una scelta chiara se la tua ricerca è molto centrata sul testo. Tuttavia, ci sono altri casi non così ovvi in ​​cui potrebbe essere una buona scelta come per le ricerche spaziali su tutte quelle persone i cui telefoni cellulari hai violato per tracciare la loro posizione. Sto solo dicendo che anche lei, signor Putin, potrebbe voler scegliere Solr.

Indipendentemente da ciò, ricorda che gli amici non consentono agli amici di eseguire bla like '%stuff' query SQL .