Fuldtekstsøgning med Solr

1. Oversigt

I denne artikel undersøger vi et grundlæggende koncept i Apache Solr-søgemaskinen - fuldtekstsøgning.

Apache Solr er en open source-ramme designet til at håndtere millioner af dokumenter. Vi gennemgår kernefunktionerne i det med eksempler ved hjælp af Java-bibliotek - SolrJ.

2. Maven-konfiguration

I betragtning af det faktum, at Solr er open source - kan vi simpelthen downloade binærprogrammet og starte serveren separat fra vores applikation.

For at kommunikere med serveren definerer vi Maven-afhængigheden for SolrJ-klienten:

 org.apache.solr solr-solrj 6.4.2 

Du kan finde den seneste afhængighed her.

3. Indekseringsdata

For at indeksere og søge data skal vi oprette en kerne; vi opretter en med navnet vare for at indeksere vores data.

Før vi gør det, skal vi indeksere data på serveren, så de bliver søgbare.

Der er mange forskellige måder, vi kan indeksere data på. Vi kan bruge dataimporthåndterere til at importere data direkte fra relationsdatabaser, uploade data med Solr Cell ved hjælp af Apache Tika eller uploade XML / XSLT-, JSON- og CSV-data ved hjælp af indekshåndterere.

3.1. Indeksering af Solr-dokument

Vi kan indeksere data til en kerne ved at skabe SolrInputDocument. Først skal vi udfylde dokumentet med vores data og derefter kun kalde SolrJ's API for at indeksere dokumentet:

SolrInputDocument doc = nyt SolrInputDocument (); doc.addField ("id", id); doc.addField ("beskrivelse", beskrivelse); doc.addField ("kategori", kategori); doc.addField ("pris", pris); solrClient.add (doc); solrClient.commit ();

Noter det id skal naturligvis være unik for forskellige genstande. At have en id af et allerede indekseret dokument opdaterer dette dokument.

3.2. Indeksering af bønner

SolrJ leverer API'er til indeksering af Java-bønner. For at indeksere en bønne skal vi kommentere den med @Mark kommentarer:

public class Item {@Field private String id; @Field private strengbeskrivelse; @Field privat streng kategori; @Field privat flydepris; }

Når vi først har fået bønnen, er indeksering ligetil:

solrClient.addBean (vare); solrClient.commit ();

4. Solr-forespørgsler

Søgning er Solrs mest magtfulde kapacitet. Når vi først har indekseret dokumenterne i vores arkiv, kan vi søge efter nøgleord, sætninger, datointervaller osv. Resultaterne sorteres efter relevans (score).

4.1. Grundlæggende forespørgsler

Serveren afslører en API til søgefunktioner. Vi kan enten ringe /Vælg eller /forespørgsel anmode håndterere.

Lad os lave en simpel søgning:

SolrQuery-forespørgsel = ny SolrQuery (); query.setQuery ("brand1"); query.setStart (0); query.setRows (10); QueryResponse respons = solrClient.query (forespørgsel); Listeelementer = respons.getBeans (Item.class);

SolrJ bruger internt forespørgselsparameteret internt q i sin anmodning til serveren. Antallet af returnerede poster vil være 10, indekseret fra nul når Start og rækker er ikke specificeret.

Søgeforespørgslen ovenfor ser efter alle dokumenter, der indeholder det komplette ord “Brand1” i et af dets indekserede felter. Noter det enkle søgninger er ikke store og små bogstaver.

Lad os se på et andet eksempel. Vi ønsker at søge på ethvert ord, der indeholder “Rand”, der starter med et vilkårligt antal tegn og slutter med kun et tegn. Vi kan bruge jokertegn * og ? i vores forespørgsel:

query.setQuery ("* rand?");

Solr-forespørgsler understøtter også boolske operatører som i SQL:

query.setQuery ("brand1 AND (Washing OR Refrigerator)");

Alle boolske operatører skal være i alle hætter; dem, der bakkes op af forespørgselsparseren, er OG, ELLER IKKE, + og -.

Hvad mere er, hvis vi vil søge på bestemte felter i stedet for alle indekserede felter, kan vi specificere disse i forespørgslen:

query.setQuery ("beskrivelse: Mærke * OG kategori: * Vask *");

4.2. Sætningsforespørgsler

Indtil dette punkt søgte vores kode efter nøgleord i de indekserede felter. Vi kan også foretage sætningssøgninger på de indekserede felter:

query.setQuery ("vaskemaskine");

Når vi har en sætning som “Vaskemaskine“, Solrs standardforespørgsel parser analyserer den til“Vask ELLER Maskine“. For at søge efter en hel sætning kan vi kun tilføje udtrykket i dobbelt anførselstegn:

query.setQuery ("\" Vaskemaskine \ "");

Vi kan bruge nærhedssøgning til at finde ord inden for bestemte afstande. Hvis vi vil finde de ord, der er mindst to ord fra hinanden, kan vi bruge følgende forespørgsel:

query.setQuery ("\" Vaskeudstyr \ "~ 2");

4.3. Område forespørgsler

Område forespørgsler giver mulighed for at få dokumenter, hvis felter er mellem bestemte områder.

Lad os sige, at vi vil finde varer, hvis pris varierer fra 100 til 300:

query.setQuery ("pris: [100 TIL 300]");

Forespørgslen ovenfor finder alle de elementer, hvis pris er mellem 100 og 300 inklusive. Vi kan bruge “}”Og“{”For at udelukke slutpunkter:

query.setQuery ("pris: {100 TIL 300]");

4.4. Filtrer forespørgsler

Filterforespørgsler kan bruges til at begrænse supersættet af resultater, der kan returneres. Filterforespørgsel påvirker ikke scoren:

SolrQuery-forespørgsel = ny SolrQuery (); query.setQuery ("pris: [100 TIL 300]"); query.addFilterQuery ("beskrivelse: Brand1", "kategori: Hvidevarer");

Generelt indeholder filterforespørgslen ofte anvendte forespørgsler. Da de ofte kan genbruges, gemmes de i cache for at gøre søgningen mere effektiv.

5. Facetteret søgning

Faceting hjælper med at arrangere søgeresultater i gruppetællinger. Vi kan facettere felter, forespørgsler eller intervaller.

5.1. Feltfacettering

For eksempel ønsker vi at få de samlede antal kategorier i søgeresultatet. Vi kan tilføje kategori felt i vores forespørgsel:

query.addFacetField ("kategori"); QueryResponse respons = solrClient.query (forespørgsel); Liste facetResults = respons.getFacetField ("kategori"). GetValues ​​();

Det facetResultater vil indeholde optællinger af hver kategori i resultaterne.

5.2. Forespørgselsfacettering

Forespørgselsfacettering er meget nyttig, når vi vil bringe antallet af underforespørgsler tilbage:

query.addFacetQuery ("Vask ELLER køleskab"); query.addFacetQuery ("Brand2"); QueryResponse respons = solrClient.query (forespørgsel); Kort facetQueryMap = respons.getFacetQuery ();

Som et resultat af dette facetQueryMap vil have optællinger af facetforespørgsler.

5.3. Range Faceting

Range faceting bruges til at få rækkevidden i søgeresultaterne. Følgende forespørgsel returnerer antallet af prisklasser mellem 100 og 251, med mellemrum med 25:

query.addNumericRangeFacet ("pris", 100, 275, 25); QueryResponse respons = solrClient.query (forespørgsel); Liste rangeFacets = respons.getFacetRanges (). Get (0) .getCounts ();

Bortset fra numeriske områder understøtter Solr også datointervaller, facettering af intervaller og facettering af pivot.

6. Hit fremhævning

Vi ønsker måske, at nøgleordene i vores søgeforespørgsel fremhæves i resultaterne. Dette vil være meget nyttigt for at få et bedre billede af resultaterne. Lad os indeksere nogle dokumenter og definere nøgleord, der skal fremhæves:

itemSearchService.index ("hm0001", "Brand1 vaskemaskine", "Hvidevarer", 100f); itemSearchService.index ("hm0002", "Brand1 Køleskab", "Hvidevarer", 300f); itemSearchService.index ("hm0003", "Brand2 Ceiling Fan", "Home Appliances", 200f); itemSearchService.index ("hm0004", "Brand2 opvaskemaskine", "vaskeudstyr", 250f); SolrQuery-forespørgsel = ny SolrQuery (); query.setQuery ("Apparater"); query.setHighlight (sand); query.addHighlightField ("kategori"); QueryResponse respons = solrClient.query (forespørgsel); Kort> hitHighlightedMap = respons.getHighlighting (); Kort highlightedFieldMap = hitHighlightedMap.get ("hm0001"); List highlightedList = highlightedFieldMap.get ("category"); Streng highLightedText = highlightedList.get (0);

Vi får den highLightedText som "Hjem Hårde hvidevarer. Bemærk, at søgeordet Hårde hvidevarer er mærket med . Standard markeringskode, der bruges af Solr, er , men vi kan ændre dette ved at indstille præ og stolpe tags:

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

7. Søgeforslag

En af de vigtige funktioner, som Solr understøtter, er forslag. Hvis nøgleordene i forespørgslen indeholder stavefejl, eller hvis vi vil foreslå at autofuldføre et søgeord, kan vi bruge forslagets funktion.

7.1. Stavekontrol

Standardsøgningshåndtereren inkluderer ikke stavekontrolkomponent; det skal konfigureres manuelt. Der er tre måder at gøre det på. Du kan finde konfigurationsoplysningerne på den officielle wiki-side. I vores eksempel bruger vi IndexBasedSpellChecker, der bruger indekserede data til stavekontrol af søgeord.

Lad os søge efter et nøgleord med stavefejl:

query.setQuery ("hme"); query.set ("stavekontrol", "til"); QueryResponse respons = solrClient.query (forespørgsel); SpellCheckResponse spellCheckResponse = respons.getSpellCheckResponse (); Forslagsforslag = spellCheckResponse.getSuggestions (). Get (0); Listealternativer = suggestion.getAlternatives (); Strengalternativ = alternativer.get (0);

Forventet alternativ til vores søgeord “Hme” burde være "hjem" da vores indeks indeholder udtrykket "hjem". Noter det stavekontrol skal aktiveres, før søgningen udføres.

7.2. Autoforslag til vilkår

Vi ønsker måske at få forslag til ufuldstændige nøgleord for at hjælpe med søgningen. Solrs foreslå komponent skal konfigureres manuelt. Du kan finde konfigurationsoplysningerne på dens officielle wiki-side.

Vi har konfigureret en navngivet anmodningshåndterer /antyder at håndtere forslag. Lad os få forslag til nøgleord “Hom”:

SolrQuery-forespørgsel = ny SolrQuery (); query.setRequestHandler ("/ foreslå"); query.set ("foreslå", "sand"); query.set ("suggest.build", "true"); query.set ("suggest.dictionary", "mySuggester"); query.set ("suggest.q", "Hom"); QueryResponse respons = solrClient.query (forespørgsel); SuggesterResponse suggesterResponse = respons.getSuggesterResponse (); Kort suggestTerms = suggesterResponse.getSuggestedTerms (); Listeforslag = suggestTerms.get ("mySuggester");

Listen forslag skal indeholde alle ord og sætninger. Bemærk, at vi har konfigureret en foreslået navn mySuggester i vores konfiguration.

8. Konklusion

Denne artikel er en hurtig introduktion til søgemaskinens muligheder og funktioner i Solr.

Vi berørte mange funktioner, men disse skraber naturligvis bare overfladen af, hvad vi kan gøre med en avanceret og moden søgeserver som Solr.

Eksemplerne, der bruges her, er tilgængelige som altid over på GitHub.