10 savjeta za bolje upite za pretraživanje u Apache Solr

Apache Solr u srcu je tražilica otvorenog koda, 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.

Prethodno sam vam pokazao kako stvoriti i učitati kolekciju u Solr; tu zbirku možete učitati sada ako to niste prethodno učinili. (Potpuno otkrivanje: Radim za Lucidworks, koji zapošljava mnoge ključne suradnike u projektu Solr.)

U ovom postu pokazat ću vam još 10 stvari koje možete učiniti s tom kolekcijom:

1. Filtrirajte upite

Razmotrite ovaj upit:

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

Na prvi pogled ovaj upit izgleda slično kao da jesam q=Provider_State:NC. Međutim, upiti za filtriranje vraćaju samo ID-ove i oni ne utječu na rezultat. Upiti za filtriranje također su predmemorirani. Ovo je dobar način da pronađete najrelevantnije q=blue suedeu, department:footwearza razliku od department:clothingili department:music.

2. Fasetiranje

Isprobajte ovaj upit:

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

Na vrhu se vraća sljedeće:

iskaznica

Faceting vam daje broj kategorija (između ostalog). Ako implementirate web mjesto za maloprodaju, na ovaj način dajete kategorije i brojeve kategorija za odjele ili na druge načine na koje dijelite svoj inventar.

3. Fasetiranje dometa

Dodajte ovo u niz upita: facet.interval=Average_Total_Payments&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]

Dobit ćete:

Ova fasetiranje raspona može pomoći u dijeljenju numeričkog polja u kategorije raspona. Ako nekome pomažete u pronalaženju prijenosnog računala u rasponu od 2000 do 3000 dolara, ovo je za vas. Umjesto toga možete učiniti sličan upit bez hard kodiranja raspona:facet.range=Average_Total_Payments&facet.range.gap=999.99&facet.range.start=2000&facet.range.end=10000

4. DocValues

U svojoj shemi provjerite je li docValuesatribut odabran za polja koja fasetirate. Ovo optimizira polje za ove vrste pretraživanja i štedi na memoriji u vrijeme upita, kao što je prikazano u ovom odlomku schema.xml:

5. Pseudopolja

Možete raditi na svojim podacima i vraćati vrijednost. Pokušaj ovo:

//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=*:*&rows=10&wt=json

Primjer koristi neke ugrađene funkcije tvrtke Solr za kategorizaciju davatelja usluga kao skupe ili jeftine na temelju prosječnih ukupnih plaćanja. Stavio sam price_category:if(min(0,sub(Average_Total_Payments,5000)),"inexpensive","expensive")na fl, ili popis polja, zajedno s još dva polja.

6. Raščlanjivači upita

defType omogućuje vam odabir jednog od Solrovih parsera upita. Zadani standardni analizator upita stvarno je dobar za određene strojno generirane upite. Ali Solr ima i parsere Dismax i eDismax, koji su bolji za normalne ljude: Možete kliknuti jednog od njih na dnu zaslona administrativnog upita ili dodati defType=dismaxu niz upita. Analizator Dismax obično daje bolje rezultate za upite koje su unijeli korisnici pronalazeći "maksimum disjunkcije" ili polje s najviše podudaranja i dodajući ga u rezultat.

7. Pojačavanje

Ako pretražujete Provider_State:AL^5 OR Provider_State:NC^10, rezultati u Sjevernoj Karolini postići će se više od rezultata u Alabami. To možete učiniti u svom upitu ( q=""). Ovo je važan način manipuliranja vraćenim rezultatima.

8. Rasponi datuma

Iako primjeri podataka ne podržavaju pretraživanja u rasponu datuma, ako jesu, oblikovani bi poput timestamp_dt:[2016-12-31T17:51:44.000Z TO 2017-02-20T18:06:44.000Z]. Solr podržava polja tipa datuma i pretraživanja i filtriranje vrsta datuma.

9. TF-IDF i BM25

Izvorni mehanizam bodovanja koji je Solr koristio (da bi utvrdio koji su dokumenti relevantni za vaš pojam za pretraživanje) naziva se TF-IDF, za "učestalost pojma nasuprot inverznoj učestalosti dokumenta". Vraća koliko se često pojam pojavljuje u vašem polju ili dokumentu u odnosu na to koliko se često taj pojam pojavljuje u vašoj zbirci. Problem ovog algoritma je taj što se "Igra prijestolja" u dokumentu od 10 stranica dogodi 100 puta nasuprot deset puta u dokumentu od 10 stranica, što dokument ne čini 10 puta relevantnijim. To ga čini više relevantne, ali ne i 1 0 puta više relevantno.

BM25 izglađuje ovaj postupak, učinkovito dopuštajući dokumentima da dosegnu točku zasićenja, nakon čega se ublažava učinak dodatnih pojava. Sve najnovije verzije Solra prema zadanim postavkama koriste BM25.

10. otklanjanje pogrešaka

U konzoli Admin Query možete provjeriti debugQuery da biste ga dodali debugQuery=onu niz upita Solr. Ako pregledate rezultate, pronaći ćete ovaj rezultat:

Između ostalog vidite da koristi LuceneQParser (naziv standardnog parsera upita) i, iznad toga, kako je postignut svaki rezultat. Vidite sam algoritam BM25 i kako su pojačanja utjecala na bodovanje. Ako pokušavate otkloniti pogreške u pretraživanju, ovo je vrlo vrijedan alat!

Ovih deset aspekata Solra zasigurno mi pomažu kada koristim Solr za pretraživanje i podešavanje mojih rezultata.