Zoeken in volledige tekst met Solr

1. Overzicht

In dit artikel onderzoeken we een fundamenteel concept in de Apache Solr-zoekmachine: zoeken in volledige tekst.

De Apache Solr is een open source framework, ontworpen om met miljoenen documenten om te gaan. We zullen de kernmogelijkheden ervan bespreken met voorbeelden met behulp van de Java-bibliotheek - SolrJ.

2. Maven-configuratie

Gezien het feit dat Solr open source is, kunnen we eenvoudig het binaire bestand downloaden en de server afzonderlijk van onze applicatie starten.

Om met de server te communiceren, definiëren we de Maven-afhankelijkheid voor de SolrJ-client:

 org.apache.solr solr-solrj 6.4.2 

U kunt de laatste afhankelijkheid hier vinden.

3. Gegevens indexeren

Om gegevens te indexeren en te zoeken, moeten we een kern; we maken er een met de naam item om onze gegevens te indexeren.

Voordat we dat doen, moeten we gegevens op de server indexeren, zodat deze doorzoekbaar worden.

Er zijn veel verschillende manieren waarop we gegevens kunnen indexeren. We kunnen handlers voor gegevensimport gebruiken om gegevens rechtstreeks uit relationele databases te importeren, gegevens te uploaden met Solr Cell met Apache Tika of XML / XSLT-, JSON- en CSV-gegevens te uploaden met index-handlers.

3.1. Solr-document indexeren

We kunnen gegevens indexeren in een kern door te maken SolrInputDocument. Eerst moeten we het document vullen met onze gegevens en dan alleen de API van SolrJ aanroepen om het document te indexeren:

SolrInputDocument doc = nieuwe SolrInputDocument (); doc.addField ("id", id); doc.addField ("beschrijving", beschrijving); doc.addField ("categorie", categorie); doc.addField ("prijs", prijs); solrClient.add (doc); solrClient.commit ();

Let daar op ID kaart moet natuurlijk uniek zijn voor anders items. Het hebben van een ID kaart van een reeds geïndexeerd document zal dat document bijwerken.

3.2. Bonen indexeren

SolrJ biedt API's voor het indexeren van Java-bonen. Om een ​​boon te indexeren, moeten we deze annoteren met de @Veld annotaties:

public class Item {@Field private String id; @Field private String beschrijving; @Field private String-categorie; @Field private float-prijs; }

Zodra we de boon hebben, is indexeren ongecompliceerd:

solrClient.addBean (item); solrClient.commit ();

4. Solr-zoekopdrachten

Zoeken is de krachtigste mogelijkheid van Solr. Zodra we de documenten in onze repository hebben geïndexeerd, kunnen we zoeken op trefwoorden, zinnen, datumbereiken, enz. De resultaten worden gesorteerd op relevantie (score).

4.1. Basisvragen

De server stelt een API beschikbaar voor zoekbewerkingen. We kunnen ofwel bellen / selecteer of / vraag verzoekbehandelaars.

Laten we een eenvoudige zoekopdracht uitvoeren:

SolrQuery-query = nieuwe SolrQuery (); query.setQuery ("brand1"); query.setStart (0); query.setRows (10); QueryResponse response = solrClient.query (query); Lijstitems = response.getBeans (Item.class);

SolrJ zal intern de belangrijkste queryparameter gebruiken q in zijn verzoek aan de server. Het aantal geretourneerde records is 10, geïndexeerd vanaf nul wanneer begin en rijen zijn niet gespecificeerd.

De bovenstaande zoekopdracht zoekt naar documenten die het volledige woord bevatten "Brand1" in een van de geïndexeerde velden. Let daar op eenvoudige zoekopdrachten zijn niet hoofdlettergevoelig.

Laten we naar een ander voorbeeld kijken. We willen elk woord zoeken dat bevat "rand", dat begint met een willekeurig aantal tekens en eindigt met slechts één teken. We kunnen jokertekens gebruiken * en ? in onze vraag:

query.setQuery ("* rand?");

Solr-query's ondersteunen ook booleaanse operatoren zoals in SQL:

query.setQuery ("brand1 AND (Wassen OF Koelkast)");

Alle booleaanse operatoren moeten in hoofdletters worden geschreven; degenen die worden ondersteund door de queryparser zijn EN, OF NIET, + en -.

Als we bovendien op specifieke velden willen zoeken in plaats van op alle geïndexeerde velden, kunnen we deze specificeren in de zoekopdracht:

query.setQuery ("beschrijving: Merk * ​​EN categorie: * Wassen *");

4.2. Zinsneden

Tot nu toe zocht onze code naar trefwoorden in de geïndexeerde velden. We kunnen ook zoeken naar woordgroepen op de geïndexeerde velden:

query.setQuery ("Wasmachine");

Als we een zin hebben als 'Wasmachine", Solr's standaard queryparser parseert het naar"Wassen OF Machine“. Om naar een hele zin te zoeken, kunnen we de uitdrukking alleen tussen dubbele aanhalingstekens toevoegen:

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

We kunnen zoeken in de buurt gebruiken om woorden binnen specifieke afstanden te vinden. Als we de woorden willen vinden die minstens twee woorden uit elkaar liggen, kunnen we de volgende zoekopdracht gebruiken:

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

4.3. Bereikquery's

Met bereikquery's kunnen documenten worden verkregen waarvan de velden tussen specifieke bereiken liggen.

Stel dat we artikelen willen vinden met een prijs tussen 100 en 300:

query.setQuery ("prijs: [100 TO 300]");

De bovenstaande zoekopdracht zal alle elementen vinden waarvan de prijs tussen 100 en 300 ligt. We kunnen gebruiken "}"En"{”Om eindpunten uit te sluiten:

query.setQuery ("prijs: {100 TO 300]");

4.4. Filter zoekopdrachten

Filterquery's kunnen worden gebruikt om de superset van resultaten die kunnen worden geretourneerd, te beperken. Filterquery heeft geen invloed op de score:

SolrQuery-query = nieuwe SolrQuery (); query.setQuery ("prijs: [100 TO 300]"); query.addFilterQuery ("description: Brand1", "categorie: huishoudelijke apparaten");

Over het algemeen bevat de filterquery veelgebruikte query's. Omdat ze vaak herbruikbaar zijn, worden ze in de cache opgeslagen om het zoeken efficiënter te maken.

5. Gefacetteerde zoekopdracht

Faceting helpt om zoekresultaten in groepstellingen te ordenen. We kunnen velden, query's of bereiken facetten.

5.1. Field Faceting

We willen bijvoorbeeld de geaggregeerde tellingen van categorieën in het zoekresultaat krijgen. We kunnen toevoegen categorie veld in onze zoekopdracht:

query.addFacetField ("categorie"); QueryResponse response = solrClient.query (query); Lijst facetResults = response.getFacetField ("categorie"). GetValues ​​();

De facetResults bevat tellingen van elke categorie in de resultaten.

5.2. Query Faceting

Query-faceting is erg handig als we het aantal subquery's willen terughalen:

query.addFacetQuery ("Wassen OF koelkast"); query.addFacetQuery ("Merk2"); QueryResponse response = solrClient.query (query); Kaart facetQueryMap = response.getFacetQuery ();

Als gevolg hiervan is het facetQueryMap zal tellingen van facetquery's hebben.

5.3. Bereik facetten

Bereikfacetering wordt gebruikt om het bereikaantal in de zoekresultaten te krijgen. De volgende zoekopdracht retourneert de tellingen van prijsklassen tussen 100 en 251, met een tussenruimte van 25:

query.addNumericRangeFacet ("prijs", 100, 275, 25); QueryResponse response = solrClient.query (query); Lijst rangeFacets = response.getFacetRanges (). Get (0) .getCounts ();

Afgezien van numerieke bereiken ondersteunt Solr ook datumbereiken, intervalfacetten en spilfacetten.

6. Druk op Markeren

Mogelijk willen we dat de zoekwoorden in onze zoekopdracht worden gemarkeerd in de resultaten. Dit zal erg handig zijn om een ​​beter beeld te krijgen van de resultaten. Laten we enkele documenten indexeren en trefwoorden definiëren die moeten worden gemarkeerd:

itemSearchService.index ("hm0001", "Brand1 Wasmachine", "Huishoudelijke apparaten", 100f); itemSearchService.index ("hm0002", "Brand1 koelkast", "Huishoudelijke apparaten", 300f); itemSearchService.index ("hm0003", "Brand2 Ceiling Fan", "Home Appliances", 200f); itemSearchService.index ("hm0004", "Brand2 Vaatwasser", "Wasapparatuur", 250f); SolrQuery-query = nieuwe SolrQuery (); query.setQuery ("Apparaten"); query.setHighlight (true); query.addHighlightField ("categorie"); QueryResponse response = solrClient.query (query); Kaart> hitHighlightedMap = response.getHighlighting (); Kaart highlightedFieldMap = hitHighlightedMap.get ("hm0001"); Lijst highlightedList = highlightedFieldMap.get ("categorie"); String highLightedText = highlightedList.get (0);

We krijgen de highLightedText net zo "Huis Huishoudelijke apparaten. Merk op dat het zoekwoord Huishoudelijke apparaten is getagd met . De standaard markeringstag die door Solr wordt gebruikt, is , maar we kunnen dit veranderen door de pre en post tags:

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

7. Zoeksuggesties

Een van de belangrijke functies die Solr ondersteunt, zijn suggesties. Als de zoekwoorden in de zoekopdracht spelfouten bevatten of als we willen voorstellen om een ​​zoekwoord automatisch aan te vullen, kunnen we de suggestiefunctie gebruiken.

7.1. Spellingcheck

De standaard zoekhandler bevat geen onderdeel voor spellingcontrole; het moet handmatig worden geconfigureerd. Er zijn drie manieren om dit te doen. Je kunt de configuratiedetails vinden op de officiële wikipagina. In ons voorbeeld gebruiken we IndexBasedSpellChecker, die geïndexeerde gegevens gebruikt voor de spellingcontrole van trefwoorden.

Laten we zoeken naar een trefwoord met een spelfout:

query.setQuery ("hme"); query.set ("spellcheck", "on"); QueryResponse response = solrClient.query (query); SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse (); Suggestiesuggestie = spellCheckResponse.getSuggestions (). Get (0); Lijst alternatieven = suggestion.getAlternatives (); String alternatief = alternatieven.get (0);

Verwacht alternatief voor ons zoekwoord "Hme" zou moeten zijn "huis" aangezien onze index de term bevat "huis". Let daar op spellingscontrole moet worden geactiveerd voordat de zoekopdracht wordt uitgevoerd.

7.2. Automatische suggesties voor termen

Mogelijk willen we de suggesties van onvolledige zoekwoorden krijgen om te helpen bij het zoeken. De suggestie-component van Solr moet handmatig worden geconfigureerd. Je kunt de configuratiedetails vinden op de officiële wikipagina.

We hebben een verzoekbehandelaar geconfigureerd met de naam /stel voor om suggesties te behandelen. Laten we suggesties voor zoekwoorden krijgen "Hom":

SolrQuery-query = nieuwe SolrQuery (); query.setRequestHandler ("/ suggest"); query.set ("suggest", "true"); query.set ("suggest.build", "true"); query.set ("suggest.dictionary", "mySuggester"); query.set ("suggest.q", "Hom"); QueryResponse response = solrClient.query (query); SuggesterResponse suggesterResponse = response.getSuggesterResponse (); Kaart SuggereerdeTerms = suggesterResponse.getSuggestedTerms (); Lijstsuggesties = suggestTerms.get ("mySuggester");

De lijst suggesties moet alle woorden en zinnen bevatten. Merk op dat we een suggester hebben geconfigureerd met de naam mySuggester in onze configuratie.

8. Conclusie

Dit artikel is een korte inleiding tot de mogelijkheden en kenmerken van de zoekmachine van Solr.

We hebben veel functies aangeroerd, maar deze zijn natuurlijk slechts aan de oppervlakte van wat we kunnen doen met een geavanceerde en volwassen zoekserver zoals Solr.

De voorbeelden die hier worden gebruikt, zijn zoals altijd beschikbaar op GitHub.


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