Pretraživanje cijelog teksta s Solr

1. Pregled

U ovom ćemo članku istražiti temeljni koncept u tražilici Apache Solr - pretraživanje cjelovitog teksta.

Apache Solr je okvir otvorenog koda, osmišljen za rad s milijunima dokumenata. Proći ćemo kroz osnovne njegove mogućnosti s primjerima koji koriste Java knjižnicu - SolrJ.

2. Konfiguracija Maven

S obzirom na činjenicu da je Solr otvorenog koda - možemo jednostavno preuzeti binarni program i pokrenuti poslužitelj odvojeno od naše aplikacije.

Da bismo komunicirali s poslužiteljem, definirat ćemo ovisnost Mavena za klijenta SolrJ:

 org.apache.solr solr-solrj 6.4.2 

Najnoviju ovisnost možete pronaći ovdje.

3. Indeksiranje podataka

Da bismo indeksirali i pretraživali podatke, moramo stvoriti jezgra; stvorit ćemo jedan s imenom artikal za indeksiranje naših podataka.

Prije nego što to učinimo, trebamo indeksirati podatke na poslužitelju, tako da postaje moguće pretraživati.

Postoji mnogo različitih načina na koje možemo indeksirati podatke. Obrađivači uvoza podataka možemo koristiti za uvoz podataka izravno iz relacijskih baza podataka, prijenos podataka pomoću Solr Cell pomoću Apache Tika ili prijenos XML / XSLT, JSON i CSV podataka pomoću indeksnih rukovatelja.

3.1. Indeksiranje Solr dokumenta

Podatke možemo indeksirati u jezgra stvaranjem SolrInputDocument. Prvo, moramo ispuniti dokument našim podacima, a zatim samo pozvati API SolrJ-a za indeksiranje dokumenta:

SolrInputDocument doc = novi SolrInputDocument (); doc.addField ("id", id); doc.addField ("opis", opis); doc.addField ("kategorija", kategorija); doc.addField ("cijena", cijena); solrClient.add (doc); solrClient.commit ();

Imajte na umu da iskaznica trebali bi biti jedinstveni za različite predmeta. Imati iskaznica već indeksiranog dokumenta ažurirat će taj dokument.

3.2. Indeksiranje graha

SolrJ nudi API-je za indeksiranje Java graha. Da bismo indeksirali grah, moramo ga označiti znakom @Polje napomene:

predmet javne klase {@Field private String id; @Field opis privatnog niza; Kategorija privatnog niza @Field; @Field privatna plutajuća cijena; }

Jednom kad imamo grah, indeksiranje je ravno prema naprijed:

solrClient.addBean (stavka); solrClient.commit ();

4. Solr upiti

Pretraživanje je najsnažnija sposobnost Solra. Jednom kad imamo dokumente indeksirane u našem spremištu, možemo pretraživati ​​ključne riječi, fraze, datumske periode itd. Rezultati se sortiraju prema relevantnosti (rezultatu).

4.1. Osnovni upiti

Poslužitelj izlaže API za operacije pretraživanja. Možemo nazvati /Odaberi ili / upit rukovatelji zahtjevima.

Izvršimo jednostavno pretraživanje:

Upit SolrQuery = novi SolrQuery (); query.setQuery ("brand1"); query.setStart (0); query.setRows (10); QueryResponse odgovor = solrClient.query (upit); Stavke na popisu = response.getBeans (Item.class);

SolrJ će interno koristiti glavni parametar upita q u svom zahtjevu poslužitelju. Broj vraćenih zapisa bit će 10, indeksirano od nule kada početak i redaka nisu navedeni.

Upit za pretragu gore potražit će sve dokumente koji sadrže cijelu riječ "Brand1" u bilo kojem od njegovih indeksiranih polja. Imajte na umu da jednostavna pretraživanja ne razlikuju velika i mala slova.

Pogledajmo još jedan primjer. Želimo pretražiti bilo koju riječ koja sadrži "Rand", koji započinje bilo kojim brojem znakova, a završava samo jednim znakom. Možemo koristiti zamjenske znakove * i ? u našem upitu:

query.setQuery ("* rand?");

Solr upiti također podržavaju logičke operatore kao u SQL-u:

query.setQuery ("brand1 I (Pranje ILI Hladnjak)");

Svi logički operateri moraju biti u svim velikim slovima; oni iza kojih stoji parser upita su I, ILI NE, + i -.

Štoviše, ako želimo pretraživati ​​određena polja umjesto svih indeksiranih polja, možemo ih odrediti u upitu:

query.setQuery ("opis: Marka * I kategorija: * Pranje *");

4.2. Upiti za fraze

Do ovog trenutka naš je kod tražio ključne riječi u indeksiranim poljima. Također možemo pretraživati ​​fraze na indeksiranim poljima:

query.setQuery ("Perilica rublja");

Kad imamo frazu poput „Perilica za rublje“, Solrov standardni raščlanjivač upita raščlanjuje na“Pranje ILI Stroj“. Da bismo tražili cijelu frazu, izraz možemo dodati samo unutar dvostrukih navodnika:

query.setQuery ("\" Perilica rublja \ "");

Blizu pretragu možemo koristiti za pronalaženje riječi na određenim udaljenostima. Ako želimo pronaći riječi koje su udaljene najmanje dvije riječi, možemo upotrijebiti sljedeći upit:

query.setQuery ("\" Oprema za pranje \ "~ 2");

4.3. Upiti o rasponu

Upiti za raspon omogućuju dobivanje dokumenata čija su polja između određenih raspona.

Recimo da želimo pronaći stavke čija se cijena kreće između 100 i 300:

query.setQuery ("cijena: [100 DO 300]");

Gornji upit pronaći će sve elemente čija je cijena između 100 i 300, uključujući. Možemo koristiti “}"I"{”Da izuzmemo krajnje točke:

query.setQuery ("cijena: {100 DO 300]");

4.4. Filtriraj upite

Upiti za filtriranje mogu se koristiti za ograničavanje nabora rezultata koji se mogu vratiti. Upit za filtriranje ne utječe na rezultat:

Upit SolrQuery = novi SolrQuery (); query.setQuery ("cijena: [100 DO 300]"); query.addFilterQuery ("opis: Brand1", "kategorija: Kućanski uređaji");

Općenito, upit za filtriranje sadržavat će najčešće korištene upite. Budući da se često mogu ponovno upotrijebiti, pohranjuju se u predmemoriju kako bi pretraživanje bilo učinkovitije.

5. Fasetno pretraživanje

Fasetiranje pomaže rasporedu rezultata pretraživanja u brojanje grupa. Možemo fasetirati polja, upite ili raspone.

5.1. Fasetiranje polja

Na primjer, želimo dobiti zbirni broj kategorija u rezultatu pretraživanja. Možemo dodati kategorija polje u našem upitu:

query.addFacetField ("kategorija"); QueryResponse odgovor = solrClient.query (upit); Popis facetResults = response.getFacetField ("kategorija"). GetValues ​​();

The facetRezultati sadržavat će brojeve svake kategorije u rezultatima.

5.2. Upit fasetiranje

Fasetiranje upita vrlo je korisno kada želimo vratiti broj podupita:

query.addFacetQuery ("Pranje ILI Hladnjak"); query.addFacetQuery ("Brand2"); QueryResponse odgovor = solrClient.query (upit); Mapa facetQueryMap = response.getFacetQuery ();

Kao rezultat, facetQueryMap imat će broj fasetnih upita.

5.3. Fasetiranje dometa

Fasetiranje raspona koristi se za dobivanje broja raspona u rezultatima pretraživanja. Sljedeći upit vratit će brojeve raspona cijena između 100 i 251, prazne za 25:

query.addNumericRangeFacet ("cijena", 100, 275, 25); QueryResponse odgovor = solrClient.query (upit); Popis rangeFacets = response.getFacetRanges (). Get (0) .getCounts ();

Osim numeričkih raspona, Solr također podržava datumska raspona, fasetiranje intervala i pivot fasetiranje.

6. Hit Highlighting

Možda bismo željeli da ključne riječi u našem upitu za pretraživanje budu istaknute u rezultatima. Ovo će biti vrlo korisno za bolju sliku rezultata. Indeksirajmo neke dokumente i definirajmo ključne riječi koje će biti istaknute:

itemSearchService.index ("hm0001", "Brand1 Perilica rublja", "Kućanski uređaji", 100f); itemSearchService.index ("hm0002", "Hladnjak marke 1", "Kućanski uređaji", 300f); itemSearchService.index ("hm0003", "Stropni ventilator marke2", "Kućanski uređaji", 200f); itemSearchService.index ("hm0004", "Brand2 Perilica posuđa", "Oprema za pranje", 250f); Upit SolrQuery = novi SolrQuery (); query.setQuery ("Uređaji"); query.setHighlight (true); query.addHighlightField ("kategorija"); QueryResponse odgovor = solrClient.query (upit); Karta> hitHighlightedMap = response.getHighlighting (); Karta istaknutoFieldMap = hitHighlightedMap.get ("hm0001"); Popis highlightedList = highlightedFieldMap.get ("kategorija"); Niz highLightedText = highlightedList.get (0);

Dobit ćemo highLightedText kao "Dom Uređaji. Napominjemo da je ključna riječ za pretraživanje Uređaji je označeno sa . Zadana oznaka za isticanje koju koristi Solr je , ali to možemo promijeniti postavljanjem prije i post oznake:

query.setHighlightSimplePre (""); query.setHighlightSimplePost ("");

7. Prijedlozi za pretraživanje

Jedna od važnih značajki koju Solr podržava su prijedlozi. Ako ključne riječi u upitu sadrže pravopisne pogreške ili ako želimo predložiti automatsko dovršavanje ključne riječi za pretraživanje, možemo koristiti značajku prijedloga.

7.1. Provjera pravopisa

Standardni rukovatelj pretraživanjem ne uključuje komponentu provjere pravopisa; mora se konfigurirati ručno. Postoje tri načina za to. Pojedinosti o konfiguraciji možete pronaći na službenoj wiki stranici. U našem ćemo primjeru koristiti IndexBasedSpellChecker, koji koristi indeksirane podatke za provjeru pravopisa za ključne riječi.

Potražimo ključnu riječ s pravopisnom pogreškom:

query.setQuery ("hme"); query.set ("provjera pravopisa", "uključeno"); QueryResponse odgovor = solrClient.query (upit); SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse (); Prijedlog prijedloga = spellCheckResponse.getSuggestions (). Get (0); Popis alternativa = prijedlog.getAlternatives (); Niz alternativa = alternative.get (0);

Očekivana alternativa za našu ključnu riječ "Hme" trebalo bi "Dom" jer naš indeks sadrži pojam "Dom". Imajte na umu da Provjera pravopisa mora se aktivirati prije izvođenja pretraživanja.

7.2. Automatsko predlaganje uvjeta

Možda ćemo htjeti dobiti prijedloge nepotpunih ključnih riječi za pomoć u pretraživanju. Komponenta Solr-ovog prijedloga mora se ručno konfigurirati. Pojedinosti o konfiguraciji možete pronaći na njegovoj službenoj wiki stranici.

Konfigurirali smo obrađivač zahtjeva s imenom /predložiti za rješavanje prijedloga. Dajmo prijedloge za ključnu riječ "Hom":

Upit SolrQuery = novi SolrQuery (); query.setRequestHandler ("/ prijedlog"); query.set ("prijedlog", "istina"); query.set ("predlagaj.graditi", "istinito"); query.set ("prijedlog. rječnika", "mySuggester"); query.set ("prijedlog.q", "Hom"); QueryResponse odgovor = solrClient.query (upit); SuggesterResponse prijedlogResponse = response.getSuggesterResponse (); Karta prijedlogTerms = prijedlogResponse.getSugngedTerms (); Popis prijedloga = prijedlogTerms.get ("mySuggester");

Popis prijedlozi treba sadržavati sve riječi i fraze. Imajte na umu da smo konfigurirali predlagača s imenom moj Sugestere u našoj konfiguraciji.

8. Zaključak

Ovaj je članak kratki uvod u mogućnosti i značajke tražilice Solr.

Dotakli smo se mnogih značajki, ali to je naravno samo grebanje površine onoga što možemo učiniti s naprednim i zrelim poslužiteljem za pretraživanje, poput Solra.

Primjeri koji se ovdje koriste dostupni su kao i uvijek na GitHub-u.


$config[zx-auto] not found$config[zx-overlay] not found