Što je Apache Solr? I zašto biste ga trebali koristiti

Apache Solr potprojekt je Apache Lucene, koji je tehnologija indeksiranja iza nedavno stvorene tehnologije pretraživanja i indeksiranja. Solr je u srcu tražilica, ali puno je više od toga. To je NoSQL baza podataka s transakcijskom podrškom. To je baza podataka dokumenata koja nudi SQL podršku i izvršava je na distribuirani način.

Zvuči zanimljivo? Pridružite mi se za bliži pogled. (Potpuno otkrivanje: Radim za Lucidworks, koji zapošljava mnoge ključne suradnike u projektu Solr.)

Trebate pristojan stroj (ili jednostavno upotrijebite AWS instancu) s idealno 8 GB ili više RAM-a. Solr možete pronaći na //lucene.apache.org/solr. Također vam je potrebna Java Virtual Machine verzija 8. Otpakirajte / untar Solr u direktorij, provjerite je li postavljen JAVA_HOME i je li Java binarni na vašem putu. Promijenite u direktorij Solr je i upišite bin/solr start -e cloud -noprompt. Ovo pokreće klaster s dva čvora na vašem prijenosnom računalu sa zbirkom uzoraka koja se naziva Getstarted Već je učitana.

Uobičajeno pokretanje bilo bi samo bin/solr start -cpokretanje Solra u "oblačnom" načinu. Ali ako ćete gurnuti gume, stvarno želite vidjeti instalaciju s više čvorova, čak i ako je to na vašem vlastitom prijenosnom računalu. Solr Cloud je način na koji želite pokrenuti modernu instalaciju Solr-a. Ako započnete bez, -cpočet ćete u naslijeđenom načinu. To je loše.

Dokumenti i zbirke

Solr je dokument strukturirana baza podataka. Entiteti poput "Osoba" sastoje se od polja poput imena, adrese i e-pošte. Ti se dokumenti čuvaju u zbirkama. Zbirke su najbliži analog tablicama u relacijskoj bazi podataka. Međutim, za razliku od relacijske baze podataka, "Osoba" može u potpunosti sadržavati entitet, što znači da ako osoba ima više adresa te se adrese mogu pohraniti u jedan dokument "Osoba". U relacijskoj bazi podataka trebala bi vam zasebna tablica adresa.

Osoba {

 "Id": "1333425",

 "First_name": "Francis",

 “Srednje_ime”: “J.”,

 “Last_name”: „Underwood”,

 „Adresa“: [„1600 Pennsylvania Ave NW, Washington, DC 20500“, „1609 Far St. NW, Washington, DC, 20036“],

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

}

Krhotine, replike i jezgre

Za razliku od većine relacijskih baza podataka, podaci se automatski izoštravaju i repliciraju putem Solr Cloud-a. To znači da se dok dokument zapisujete u pravilno konfiguriranu zbirku distribuira u jednu od Solr instanci. To je "oštrenje". To se radi za poboljšanje izvedbe čitanja. Svaki se dokument također replicira ili kopira barem jednom (može se konfigurirati) radi suvišnosti. To znači da možete izgubiti instancu Solr i trpjeti samo smanjenu izvedbu na klasteru, ali bez gubitka podataka.

Klaster je skup "čvorova", koji su instance Java Virtual Machine (JVM) koji izvode Solr. Čvor može sadržavati više "jezgri". Svaka je jezgra replika logičnog "krhotina". Općenito se jezgre identificiraju zbirkom, brojem krhotine i brojem replike spojenim zajedno kao niz.

Izrada kolekcije

Iako postoje HTTP sučelja nalik na REST, možete samo upotrijebiti naredbu bin/solr(ili bin/solr.cmd) za stvaranje i upravljanje zbirkama. Upotrijebimo ne kontroverznu temu i pronađemo javni skup podataka. Uzmite kopiju podataka o troškovima zdravstvene zaštite s Data.gov. Radi jednostavnosti, uzmite ga kao CSV. Pod pretpostavkom da ste pokrenuli Solr prema uputama, upotrijebite ovu naredbu za stvaranje zbirke zvane ipps:

bin / solr create_collection -d basic_configs -c ipps

Zatim učitajmo podatke u zbirku. Prvo moramo popraviti nekoliko stvari u CSV datoteci. Uklonite sve $znakove. Također, u gornjem redu naziva polja, promijenite polja iz razmaka u donje podvlake. Neka čita ovako:

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_Medicare_Payments

Postoje moćniji alati za ETL od onoga što je ugrađeno u Solr (poput onog ugrađenog u proizvod koji moja tvrtka prodaje), ali sveukupno ovo nije bilo složeno rješenje!

Prije nego što učitamo bilo kakve podatke, moramo stvoriti "shemu" koja je slična onoj koju imate u relacijskoj bazi podataka. To možemo učiniti curlnaredbom na Linuxu / Macu ili možete koristiti GUI alat poput Postmana.

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

 “Add-field”: {

     “Name”: “DRG_Definition”,

     "Type": "text_general",

     "Indeksirano": istina,

     "Pohranjeno": istina

  },

 “Add-field”: {

     “Name”: “Provider_Id”,

     "Type": "plong",

     “DocValues”: istina,

     "Indeksirano": istina,

     "Pohranjeno": istina

  },

 “Add-field”: {

     “Name”: “Provider_Name”,

     "Type": "text_general",

     "Indeksirano": istina,

     "Pohranjeno": istina

  },

 “Add-field”: {

     “Name”: “Provider_Street_Address”,

     "Type": "string",

     "Indeksirano": lažno,

     "Pohranjeno": istina

  },

 “Add-field”: {

     “Name”: “Provider_City”,

     "Type": "string",

     "Indeksirano": istina,

     "Pohranjeno": istina

  },

 “Add-field”: {

     “Name”: “Provider_State”,

     "Type": "string",

     "Indeksirano": istina,

     "Pohranjeno": istina

  },

 “Add-field”: {

     “Name”: “Provider_Zip_Code”,

     "Type": "string",

     "Indeksirano": istina,

     "Pohranjeno": istina

  },

 “Add-field”: {

     “Name”: “Hospital_Referral_Region_Description”,

     "Type": "text_general",

     "Indeksirano": istina,

     "Pohranjeno": istina

  },

 “Add-field”: {

     “Name”: “Ukupno_ispunjenja”,

     "Type": "pinta",

     “DocValues”: istina,

     "Indeksirano": istina,

     "Pohranjeno": istina

  },

 “Add-field”: {

     “Name”: “Prosječni_pokriveni_naplati”,

     "Type": "pdouble",

     “DocValues”: istina,

     "Indeksirano": istina,

     "Pohranjeno": istina

  },

 “Add-field”: {

     “Name”: “Prosječni_ukupi_plaćanja”,

     "Type": "pdouble",

     “DocValues”: istina,

     "Indeksirano": istina,

     "Pohranjeno": istina

  },

 “Add-field”: {

     “Name”: “Prosječni_plata_medicara”,

     "Type": "pdouble",

     “DocValues”: istina,

     "Indeksirano": istina,

     "Pohranjeno": istina

  }

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

To su nazivi polja, vrste polja i treba li ih indeksirati i pohraniti. U referentnom vodiču možete saznati više o Solrovim vrstama podataka i ukupnoj shemi.

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 možda neće biti vaš najbolji izbor ako imate jednostavne podatke koje tražite prema ključu i na kojima uglavnom pišete. Solr ima previše vodovoda za obavljanje većih stvari da bi za to bio jednako učinkovit kao spremište ključne vrijednosti.

Solr je jasan izbor ako je vaše pretraživanje usmjereno na tekst. Međutim, postoje i drugi ne toliko očiti slučajevi u kojima bi to mogao biti dobar izbor poput prostornih pretraživanja svih onih ljudi čiji ste mobiteli hakirali kako bi pratili njihovo mjesto. Samo kažem da biste i vi, gospodine Putin, možda željeli odabrati Solr.

Bez obzira na to, samo imajte na umu da prijatelji ne dopuštaju prijateljima da rade SQL bla like '%stuff' upite.