Records zoeken is een veel voorkomende eis in webapplicaties. Gewoonlijk is er een vereiste om gebruikers in staat te stellen snel toegang te krijgen tot de gewenste gegevens uit grote records. Hoewel het mogelijk is om dit te doen met eenvoudige SQL-query's, is het soms efficiënter om een zoekmachine te gebruiken.
Solr is een populair zoekplatform van het Apache Lucene-project. De belangrijkste functies zijn krachtige full-text search, hit-highlighting, gefaceteerde zoekopdrachten, bijna-realtime indexering, dynamische clustering, database-integratie, uitgebreide documentafhandeling en georuimtelijke zoekactie. In deze zelfstudie zullen we kijken naar het uitvoeren van full text search met Sunspot, een bibliotheek die integratie van Solr in ruby-toepassingen mogelijk maakt.
Ik heb een eenvoudige app op Github gemaakt die ik hier ga gebruiken in plaats van te beginnen met een nieuw project. De app toont een lijst met producten met hun naam, afbeelding, prijs en beschrijving. Ik heb wat seed-gegevens toegevoegd, zodat je kunt rennen hark db: zaad
als u de gegevens niet zelf wilt invoeren. De applicatie maakt gebruik van Paperclip voor beeldbijlagen en aangezien ik het formaat van de afbeelding gebruik, moet ImageMagick op uw systeem zijn geïnstalleerd. U hebt ook de Java-runtime nodig die op uw computer is geïnstalleerd om door te gaan met de zelfstudie.
De afbeelding hieronder toont de applicatie. Het zoekformulier aan de bovenkant doet op dit moment niets, maar we zullen een gebruiker in staat stellen om door de producten te zoeken en resultaten te krijgen op basis van niet alleen de productnaam, maar ook op basis van de beschrijving.
We beginnen met het opnemen van de Sunspot- en Solr-edelstenen in ons Gemfile. Voor ontwikkeling gebruiken we de sunspot_solr
juweel dat wordt geleverd met een voorverpakte Solr-distributie, daarom hoeven we het niet apart te installeren.
gem 'sunspot_rails' groep: ontwikkeling do gem 'sunspot_solr' einde
Rennen bundel installeren
en voer dan de volgende opdracht uit om het Sunspot-configuratiebestand te genereren.
rails genereren sunspot_rails: installeren
Dit maakt de /config/sunspot.yml
bestand waarmee uw app weet waar de Solr-server te vinden is.
Als u de objecten wilt instellen die u wilt indexeren, voegt u een doorzoekbaar blok toe aan de objecten. In het startersproject hebben we een Productmodel met naam, prijs, beschrijving en fotovelden. We zullen een volledige tekstzoekactie in de naam- en beschrijvingsvelden mogelijk maken. In /models/product.rb
toevoegen:
doorzoekbare tekst: naam,: beschrijving einde
Start de Solr-server door te draaien:
hark zonnevlek: solr: start
Sunspot indexeert nieuwe records die u maakt, maar als u al enkele records in de database hebt, voert u uit hark zonnevlekken: herindexeren
om ze geïndexeerd te hebben.
Vervolgens voegen we de code toe aan de Products-controller die de invoer van de gebruiker verwerkt en doorgeeft aan de zoekmachine. In de onderstaande code bellen we zoeken
op het productmodel en geef een blok door. We noemen het hele tekst
methode in het blok en geef de queryreeks door waarnaar we willen zoeken. Er zijn verschillende methoden die we hier kunnen gebruiken om de gewenste zoekresultaten te specificeren. De zoekresultaten worden vervolgens toegewezen aan @products
welke naar onze mening beschikbaar zal zijn.
def index @query = Product.search doet fulltext params [: search] end @products = @ query.resultaten eindigt
Start de applicatie en je zou nu in staat moeten zijn om de beschikbare producten te doorzoeken.
Solr zal een niet-hoofdlettergevoelig zoeken uitvoeren via de productnamen en beschrijvingen met behulp van de woord- of frase-invoer. U kunt één veld meer gewicht laten hebben dan het andere om de relevantie van uw zoekresultaten te verbeteren. Dit wordt gedaan met de boost
methode waarbij een waarde wordt doorgegeven die de prioriteit bepaalt die aan de verschillende velden is toegewezen. Het veld met de hoogste waarde zal belangrijker zijn.
In onze applicatie kunnen we de producten specificeren die de gezochte string in hun naam hebben om hoger te scoren. We doen dit door de volgende wijzigingen aan te brengen /models/product.rb
.
doorzoekbare tekst: naam,: boost => 2 tekst: beschrijving einde
Indexeer de records opnieuw met hark zonnevlekken: herindexeren
en nu worden de resultaten met de gezochte term in de productnaam hoger geplaatst dan die met de term in de beschrijving. U kunt meer records toevoegen om dit uit te testen.
Faceted browsing is een manier om zoekgegevens te doorzoeken door middel van verschillende sets van geassocieerde attributen. In onze toepassing kunnen we bijvoorbeeld zoekopdrachten naar producten sorteren op prijscategorie en tellen voor elk bereik.
Voeg eerst prijs toe aan de doorzoekbaar
methode in /models/product.rb
doorzoekbare tekst: naam,: boost => 2 tekst: description double: price end
Bel dan facet
in de controller. De producten worden gefacetteerd door het bereik van hun prijs in intervallen van $ 100,00. Hier nemen we aan dat alle producten minder dan $ 500 kosten.
def index @query = Product.search doet fulltext params [: search] facet: price,: range => 0 ... 500,: range_interval => 100 with (: price, Range.new (* params [: price_range] .split ( "...") .map (&: to_i))) if params [: price_range] .present? end @products = @ query.resultaten eindigen
Plak het volgende in het weergavebestand op de plaats waar u de resultaten met facetten wilt zien.
Zoekresultaten
<% for row in @query.facet(:price).rows %>
- <% if params[:price_range].blank? %> <%= link_to row.value, :price_range => row.value,: search => params [: search]%> (<%= row.count %>) <% else %> <%= row.value %> (<%= link_to "X", :price_range => nul%>) <% end %>
<% end %>
Wanneer u nu naar een term zoekt, wordt er een lijst met facetten weergegeven die aangeeft hoeveel resultaten er in elke prijsklasse zijn. In onze voorbeeldtoepassing ziet u de volgende lijst als u zoekt naar het woord 'camera'.
100.0 ... 200.0 (2) 200.0 ... 300.0 (1) 300.0 ... 400.0 (1)
Elk item is een link en wanneer erop wordt geklikt, krijgt u een lijst met de producten die aan uw zoekterm voldoen en die ook in de prijsklasse vallen waarop u hebt geklikt.
De koppeling geeft de oorspronkelijke zoekopdracht en het gekozen bereik door aan de indexactie. Omdat het het bereik als een reeks doorgeeft, gebruiken we Range.new (* params [: price_range] .split ("...") .map (&: to_i))
om het terug te converteren naar een bereik. U kunt voorwaardelijke instructies gebruiken om meer gebruiksvriendelijke koppelingen zoals uit te voeren $ 100 - $ 199 (2)
in plaats van 100.0 ... 200.0 (2)
maar daar komen we hier niet op in.
Er zijn nog enkele configuraties die u kunt doen op Solr om aan te passen hoe het werkt. In de standaardinstelling voert Sunspot een zoekopdracht in volledige tekst uit door de zoekreeks in tokens te delen op basis van witruimte en andere scheidingstekens met een slimme tokenizer, genaamd StandardTokenizer
. Vervolgens worden de tokens lager ingekapseld en wordt er naar de exacte woorden gezocht.
Dit kan soms goed zijn, maar je zou ook de zoekmachine kunnen aanpassen om menselijke fouten toe te staan of om vragen toe te staan die niet te strikt zijn. U kunt bijvoorbeeld een aantal synoniemen aan de engine toevoegen, zodat wanneer de gebruiker niet de exacte tekst invoert die in uw records staat, deze nog steeds vergelijkbare resultaten kunnen vinden. Een voorbeeld hiervan is dat u misschien een item met het label 'ipod' in uw administratie hebt staan. U kunt synoniemen opgeven als 'iPod', 'i-pod' en 'i pod' om de kans te vergroten dat gebruikers de gegevens vinden.
Een andere bruikbare functionaliteit die u zou kunnen toevoegen is stemming, waardoor Solr verschillende woorden kan matchen met dezelfde root. Als de gebruiker bijvoorbeeld 'uitvoeren' heeft ingevoerd, krijgen deze resultaten met 'uitvoeren' en 'uitvoeren'. Of als ze naar 'lopen' hebben gezocht, bevatten de resultaten gegevens die 'lopen', 'lopen', 'wandelen', enzovoort bevatten.
Solr-instellingen zijn te vinden in SOLR / conf / schema.xml
en dat is het bestand dat moet worden gewijzigd om de configuratie van de server te wijzigen. Dit is buiten het bestek van deze zelfstudie, maar voor meer informatie, bekijk de geavanceerde full-text configuratiepost en de Solr wiki.
Om nu af te sluiten, stop de Solr-server met:
hark zonnevlek: solr: stop
We hebben gekeken hoe we de Sunspot-edelsteen kunnen gebruiken om de Solr-zoekmachine te gebruiken in een Rails-app. Naast de instellingen die we hebben gebruikt, zijn er nog veel meer die u kunt gebruiken om uw zoekresultaten aan te passen. Controleer het Leesmij-bestand voor meer opties.
Solr biedt u het soort zoekmogelijkheden dat niet eenvoudig te bereiken is met gewone SQL-query's. Voor eenvoudige apps, met een kleine hoeveelheid databaserecords, kunnen SQL-query's zonder veel prestatiereactie. Maar als u iets wilt dat schaalbaar is, dan is het de moeite waard om naar Solr of andere beschikbare zoekmachines te kijken.