Programmering

Hvad er Apache Solr? Og hvorfor du skal bruge det

Apache Solr er et delprojekt af Apache Lucene, som er indekseringsteknologien bag den senest oprettede søge- og indeksteknologi. Solr er en grundlæggende søgemaskine, men det er meget mere end det. Det er en NoSQL-database med transaktionsunderstøttelse. Det er en dokumentdatabase, der tilbyder SQL-support og udfører den på en distribueret måde.

Lyder interessant? Deltag i mig for et nærmere kig. (Fuld offentliggørelse: Jeg arbejder for Lucidworks, der beskæftiger mange af de vigtigste bidragydere til Solr-projektet.)

Du har brug for en anstændig maskine (eller brug bare en AWS-forekomst) med ideelt 8 GB eller mere RAM. Du kan finde Solr på //lucene.apache.org/solr. Du har også brug for Java Virtual Machine version 8. Unzip / untar Solr i en mappe, sørg for, at JAVA_HOME er indstillet, og at java-binæren er i din vej. Skift til den mappe, Solr er i, og skriv bin / solr start -e sky -noprompt. Dette starter en to-node-klynge på din bærbare computer med en prøveindsamling kaldet getstarted allerede indlæst.

En normal opstart ville bare være bin / solr start-c for at starte Solr i “sky” -tilstand. Men hvis du vil sparke dækkene, vil du virkelig se, at en multi-node installeres, selvom den er på din egen bærbare computer. Solr Cloud er den måde, du vil køre en moderne Solr-installation på. Hvis du starter uden -c du starter i ældre tilstand. Det er en dårlig ting.

Dokumenter og samlinger

Solr er en dokumentstruktureret database. Enheder som "Person" er sammensat af felter som navn, adresse og e-mail. Disse dokumenter opbevares i samlinger. Samlinger er den nærmeste analog til tabeller i en relationsdatabase. I modsætning til i en relationsdatabase kan "Person" imidlertid indeholde enheden fuldstændigt, hvilket betyder at hvis en person har flere adresser, kan disse adresser gemmes i et "Person" -dokument. I en relationsdatabase har du brug for en separat adressetabel.

Person {

"Id": "1333425",

“First_name”: “Francis”,

“Mellemnavn”: “J.”,

“Last_name”: “Underwood”,

“Adresse”: [“1600 Pennsylvania Ave NW, Washington, DC 20500”, “1609 Far St. NW, Washington, D.C., 20036”],

“Telefon”: [“202-456-1111”, “202-456-1414”]

}

Skår, replikaer og kerner

I modsætning til i de fleste relationsdatabaser deles data og replikeres automatisk via Solr Cloud. Dette betyder, at når du skriver et dokument til en korrekt konfigureret samling, distribueres det til en af ​​Solr-forekomsterne. Det er "sharding". Det gøres for at forbedre læseevnen. Hvert dokument replikeres eller kopieres også mindst én gang (konfigureres) for redundans. Dette betyder, at du kan miste en Solr-forekomst og kun lide nedsat ydelse på tværs af din klynge, men intet datatab.

En klynge er et sæt "noder", som er Java Virtual Machine (JVM) -forekomster, der kører Solr. En node kan indeholde flere "kerner". Hver kerne er en replika af et logisk "skår". Generelt identificeres kerner ved indsamling, shardnummer og replikanummer sammenkædet som en streng.

Oprettelse af en samling

Selvom der er REST-lignende HTTP-grænseflader, kan du bare bruge skraldespand / solr (eller bin / solr.cmd) kommando til at oprette og kontrollere samlinger. Lad os bruge et ikke-kontroversielt emne og finde et offentligt datasæt. Tag en kopi af sundhedsomkostningsdata fra Data.gov. For enkelheds skyld skal du tage det som en CSV. Forudsat at du startede Solr som anvist, skal du bruge denne kommando til at oprette en samling kaldet ipps:

bin / solr create_collection -d basic_configs -c ipps

Lad os derefter indlæse data i samlingen. Først skal vi rette et par ting i CSV-filen. Fjern alle $ tegn. I den øverste række af feltnavne skal du også ændre felterne fra mellemrum til understregning. Få det til at læse sådan:

DRG_Definition, Provider_Id, Provider_Name, Provider_Street_Address, Provider_City, Provider_State, Provider_Zip_Code, Hospital_Referral_Region_Description, Total_Diskarges, Average_Covered_Ccharges, Average_Total_Payments, Average_Medicare_P

Der er mere kraftfulde værktøjer til ETL end hvad der er indbygget i Solr (som det, der er indbygget i det produkt, som min virksomhed sælger), men generelt var dette ikke en kompliceret løsning!

Før vi indlæser data, skal vi dog oprette et "skema", der svarer til det, du har i en relationsdatabase. Vi kan gøre det med krølle kommando på Linux / Mac, eller du kan bruge et GUI-værktøj som Postman.

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

“Tilføjelsesfelt”: {

“Navn”: ”DRG_Definition”,

“Type”: ”text_general”,

"Indekseret": sandt,

“Gemt”: sandt

  },

“Tilføjelsesfelt”: {

“Navn”: ”Udbyder_Id”,

“Type”: ”plong”,

“DocValues”: sandt,

"Indekseret": sandt,

“Gemt”: sandt

  },

“Tilføjelsesfelt”: {

“Navn”: ”Udbydernavn”,

“Type”: ”text_general”,

"Indekseret": sandt,

“Gemt”: sandt

  },

“Tilføjelsesfelt”: {

“Navn”: ”Provider_Street_Address”,

“Type”: ”streng”,

"Indekseret": falsk,

"Gemt": sandt

  },

“Tilføjelsesfelt”: {

"Navn": "Provider_City",

“Type”: ”streng”,

"Indekseret": sandt,

“Gemt”: sandt

  },

“Tilføjelsesfelt”: {

“Navn”: ”Provider_State”,

“Type”: ”streng”,

"Indekseret": sandt,

"Gemt": sandt

  },

“Tilføjelsesfelt”: {

“Navn”: ”Provider_Zip_Code”,

“Type”: ”streng”,

"Indekseret": sandt,

“Gemt”: sandt

  },

“Tilføjelsesfelt”: {

“Navn”: ”Hospital_Referral_Region_Description”,

“Type”: ”text_general”,

"Indekseret": sandt,

"Gemt": sandt

  },

“Tilføjelsesfelt”: {

“Navn”: ”Total_Discharges”,

“Type”: ”pint”,

“DocValues”: sandt,

"Indekseret": sandt,

“Gemt”: sandt

  },

“Tilføjelsesfelt”: {

"Navn": "Gennemsnitlig_overdækket_opkrævning",

“Type”: ”pdouble”,

“DocValues”: sandt,

"Indekseret": sandt,

“Gemt”: sandt

  },

“Tilføjelsesfelt”: {

“Navn”: ”Gennemsnit_Betalinger_Betalinger”,

“Type”: ”pdouble”,

“DocValues”: sandt,

"Indekseret": sandt,

"Gemt": sandt

  },

“Tilføjelsesfelt”: {

"Navn": "Gennemsnitlig_medicinsk_betaling",

“Type”: ”pdouble”,

“DocValues”: sandt,

"Indekseret": sandt,

“Gemt”: sandt

  }

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

Disse er feltnavne, felttyper, og hvorvidt feltet skal indekseres og gemmes. Du kan finde ud af mere om Solrs datatyper og overordnede skema i referencevejledningen.

Nu hvor vi har et skema, kan vi "poste" dataene i Solr. Der er mange ruter til at gøre dette. Du kan bruge curl eller Postman, men Solr inkluderer et kommandolinjeværktøj, bin / post, som vil være tilgængelig ud af kassen på Linux og 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.

På Windows:

java -Dtype = text / csv -Dc = ipps -Dparams = "rowid = id" -jar eksempel \ exampledocs \ post.jar \ Brugere \ acoliver \ Downloads \ Inpatient_Prospective_Payment_System__IPPS__Provider_Summary_for_the_Top_100_Diagnosis-Related_Groups_DR__sv

W00t du har data!

Forespørgsel om dine data

Der er sprogbindinger til Solr, som du kan bruge til Java eller Python, eller hvis du er mere en strømudvikler, kan du bruge den til PHP. Eller du kan bare bruge krølle eller postbud eller din browser.

Indsæt dette i en adresselinje:

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

Denne URL er en simpel forespørgsel, der returnerer de 10 mest relevante resultater. Du kan ændre sideinddelingen og finde ud af mere om Solrs Solrs forespørgselssprog og endda alternative forespørgselsparsere i referencevejledningen. Hvis du vil se det samme i XML, kan du konfigurere det.

Måske vil du gøre noget lidt mere avanceret. Nedenfor finder du procedurer i den by, jeg bor i:

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

Du kan gå meget længere og lave flere resuméer og beregninger og fuzzy matches.

Solr administration

Nogle af jer er som "Godt, kommandolinjen skræmmer mig!" Så det er fint, Solr har en GUI. Kom til // localhost: 8983 / solr og se denne skønhed:

Hvis du vælger din samling på siden, kan du endda gå til et skærmbillede, der giver dig mulighed for at udfylde forespørgselsparametre:

Hvis skærmen giver dig hovedpine, kan du bare gå til // localhost: 8983 / solr / ipps / browse.

Vi har foretaget enkle tekstforespørgsler. Du kan også foretage områder og geografiske søgninger. Hvis sorteringen "relevans" ikke virker for dig, kan du gøre mere avancerede udtryk og få Solr til at returnere ting "som de findes", ligesom en RDBMS gør det. Du kan sortere på forskellige felter og filtrere efter kategorier. Du kan endda få det til at "lære at rangere" - en maskinlæringsfunktion, der lader Solr "lære", hvad brugerne synes er det mest relevante resultat. Vi har egentlig kun ridset overfladen.

Hvorfor Solr?

Så klart kan du vælge at bruge Solr, hvis du har brug for en søgemaskine. Det er dog også en redundant distribueret dokumentdatabase, der tilbyder SQL (ud af boksen) til dem, der ønsker at forbinde værktøjer som Tableau. Det kan udvides på Java (og andre JVM-sprog), og alligevel med den REST-lignende grænseflade kan du nemt tale JSON eller XML til det.

Solr er muligvis ikke dit bedste valg, hvis du har enkle data, som du kigger op med nøglen og for det meste skriver om. Solr har for meget VVS til at gøre større ting for at være lige så effektive til det som en nøgleværdibutik.

Solr er et klart valg, hvis din søgning er meget tekstcentreret. Der er dog andre ikke så åbenlyse tilfælde, hvor det kan være et godt valg som for rumlige søgninger på alle de mennesker, hvis mobiltelefoner du har hacket for at spore deres placering. Jeg siger bare, at du, Mr. Putin, måske også vil vælge Solr.

Uanset hvad skal du bare huske at venner ikke lader venner lave SQL bla som '% stuff' forespørgsler.