Programmering

10 tip til bedre søgeforespørgsler i Apache Solr

Apache Solr er en open source-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.

Tidligere har jeg vist dig, hvordan du opretter og indlæser en samling i Solr; du kan indlæse samlingen nu, hvis du ikke havde gjort det tidligere. (Fuld offentliggørelse: Jeg arbejder for Lucidworks, der beskæftiger mange af de vigtigste bidragydere til Solr-projektet.)

I dette indlæg viser jeg dig mere 10 ting, du kan gøre med denne samling:

1. Filtrer forespørgsler

Overvej denne forespørgsel:

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

På dette ansigt ser denne forespørgsel ud som om jeg bare gjorde det q = Provider_State: NC. Imidlertid returnerer filterforespørgsler kun id'er, og de påvirker ikke scoren. Filterforespørgsler cachelagres også. Dette er en god måde at finde det mest relevante på q = blå ruskind i afdeling: fodtøj i modsætning til afdeling: tøj eller afdeling: musik.

2. Facettering

Prøv denne forespørgsel:

// localhost: 8983 / solr / ipps / select? facet = on &facet.field = Provider_State& facet.limit = -1 & indent = on & q = *: * & wt = json

Følgende returneres øverst:

ID

Faceting giver dig dine kategoritællinger (blandt andet). Hvis du implementerer et detailwebsted, giver du dette kategorier og kategoritællinger til afdelinger eller andre måder, du deler din beholdning på.

3. Facettering af rækkevidde

Føj dette til en forespørgselsstreng: facet.interval = Gennemsnitlig_Betalinger & facet.interval.set = [0,1999.99] & facet.interval.set = [2000,2999.99] & facet.interval.set = [3000,3999.99] & facet.interval.set = [4000,4999.99] & facet. interval.set = [5000,5999.99] & facet.interval.set = [6000,6999.99] & facet.interval.set = [7000,7999.99] && facet.interval.set = [8000,8999.99] & facet.interval.set = [9000 , 10000]

Du får:

Denne facettering kan hjælpe med at opdele et numerisk felt i kategorier af områder. Hvis du hjælper nogen med at finde en bærbar computer i området $ 2.000 - $ 3.000, er dette noget for dig. Du kan foretage en lignende forespørgsel uden at hårdkode intervallerne ved at gøre dette i stedet: facet.range = Gennemsnitlig_Total_Payments & facet.range.gap = 999.99 & facet.range.start = 2000 & facet.range.end = 10000

4. DocValues

I dit skema skal du sørge for, at docValues attribut er valgt for felter, du facetterer på. Dette optimerer feltet til denne slags søgninger og sparer hukommelse på forespørgselstidspunktet, som vist i dette skema.xml-uddrag:

5. PseudoFields

Du kan udføre operationer på dine data og returnere en værdi. Prøv dette:

// localhost: 8983 / solr / ipps / select? fl = Provider_Name,% 20Average_Total_Payments, price_category: if (min (0, sub (Average_Total_Payments, 5000)),% 22inexpensive% 22,% 22expensive% 22) & indent = on & q = * : * & rækker = 10 & wt = json

Eksemplet bruger nogle af Solrs indbyggede funktioner til at kategorisere udbydere som dyre eller billige baseret på de gennemsnitlige samlede betalinger. Jeg sætter price_category: if (min (0, sub (Gennemsnitlig_Total_Payments, 5000)), "billig", "dyrt") i fleller feltliste sammen med to andre felter.

6. Spørgsmålsparsere

defType giver dig mulighed for at vælge en af ​​Solrs forespørgselsparsere. Standard Standard Query Parser er virkelig god til specifikke maskindannede forespørgsler. Men Solr har også Dismax- og eDismax-parserne, som er bedre for normale mennesker: Du kan klikke på en af ​​dem i bunden af ​​admin-forespørgselsskærmen eller tilføje defType = dismax til din forespørgselsstreng. Dismax-parseren genererer generelt bedre resultater for brugerindtastede forespørgsler ved at finde "disjunction maximum" eller det felt med flest matches og tilføje det til scoren.

7. Boosting

Hvis du søger Provider_State: AL ^ 5 ELLER Provider_State: NC ^ 10, bliver resultaterne i North Carolina scoret højere end resultaterne i Alabama. Du kan gøre dette i din forespørgsel (q = ""). Dette er en vigtig måde at manipulere de returnerede resultater på.

8. Datointervaller

Selvom eksempeldataene ikke understøtter nogen datointervalssøgninger, ville de blive formateret, hvis de gjorde det tidsstempel_dt: [2016-12-31T17: 51: 44.000Z TIL 2017-02-20T18: 06: 44.000Z]. Solr understøtter datatypefelter og datatypesøgninger og filtrering.

9. TF-IDF og BM25

Den oprindelige scoringsmekanisme, som Solr brugte (til at bestemme hvilke dokumenter, der var relevante for dit søgeudtryk) kaldes TF-IDF for "termfrekvens versus den inverse dokumentfrekvens." Det returnerer, hvor ofte et udtryk forekommer i dit felt eller dokument versus hvor ofte dette udtryk forekommer samlet i din samling. Problemet med denne algoritme er, at det at have "Game of Thrones" forekommer 100 gange i et 10-siders dokument versus ti gange i et 10-siders dokument, gør ikke dokumentet 10 gange mere relevant. Det gør det mere relevant men ikke 10 gange mere relevant.

BM25 udjævner denne proces og lader dokumenter effektivt nå et mætningspunkt, hvorefter virkningen af ​​yderligere hændelser mindskes. Nyere versioner af Solr bruger alle BM25 som standard.

10. debugQuery

I Admin Query-konsollen kan du kontrollere debugQuery for at tilføje debugQuery = til til Solr-forespørgselsstrengen. Hvis du inspicerer resultaterne, finder du denne output:

Blandt andet ser du, at det er at bruge LuceneQParser (navnet på standardforespørgselsparseren) og derudover, hvordan hvert resultat blev scoret. Du ser selve BM25-algoritmen, og hvordan boosts påvirkede scoringen. Hvis du prøver at fejle din søgning, er dette et meget værdifuldt værktøj!

Disse ti aspekter af Solr hjælper mig bestemt, når jeg bruger Solr til søgning og indstilling af mine resultater.