Căutarea în Full Text în Rails

Ce veți crea

Introducere

Căutarea înregistrărilor este o cerință comună în aplicațiile web. Există, de obicei, o cerință de a permite utilizatorilor să acceseze rapid datele pe care le doresc din înregistrări mari. În timp ce este posibil să faceți acest lucru folosind interogări SQL simple, uneori este mai eficient să utilizați un motor de căutare.

Solr este o platformă populară de căutare din proiectul Apache Lucene. Caracteristicile sale majore includ căutarea full-text puternică, evidențierea paginilor, căutare fațetată, indexarea în timp real, gruparea dinamică, integrarea bazei de date, manipularea bogată a documentelor și căutarea geospațială. În acest tutorial, vom analiza efectuarea căutării textului integral utilizând Sunspot, o bibliotecă care permite integrarea Solr în aplicații ruby.

Setarea proiectului

Am creat o aplicație simplă pe Github pe care o voi folosi aici în loc să încep cu un nou proiect. Aplicația prezintă o listă de produse cu numele, imaginea, prețul și descrierea. Am inclus câteva date despre semințe pentru a putea rula rake db: semințe dacă nu doriți să introduceți datele dvs. de sine. Aplicația utilizează Paperclip pentru atașamente de imagini și din moment ce folosesc redimensionarea imaginilor, ImageMagick va trebui să fie instalat pe sistemul dvs. De asemenea, veți avea nevoie de timpul de executare Java instalat pe aparat pentru a continua cu tutorialul.

Imaginea de mai jos prezintă aplicația. Formularul de căutare din partea de sus nu face nimic în acest moment, dar vom permite unui utilizator să caute prin produse și să obțină rezultate bazate nu numai pe numele produsului, ci și pe descrierea sa.

In cautarea

Vom începe prin includerea pietrelor Sunspot și Solr în Gemfile noastre. Pentru dezvoltare, vom folosi sunspot_solr bijuterie care vine cu o distribuție Solr pre-ambalate, prin urmare nu va trebui să o instalăm separat.

gem 'sunspot_rails' grup: development do gem 'sunspot_solr' end

Alerga instalare pachet apoi executați următoarea comandă pentru a genera fișierul de configurare Sunspot.

șinele generează sunspot_rails: instalați

Aceasta creează /config/sunspot.yml fișier care permite aplicației dvs. să știe unde să găsească serverul Solr.

Pentru a configura obiectele pe care doriți să le indexați, adăugați un bloc de căutare către obiecte. În proiectul de pornire, avem un model de produs cu câmpuri de nume, preț, descriere și foto. Vom permite efectuarea unei căutări în format text pe câmpurile de nume și descriere. În /models/product.rb adăuga:

se poate căuta text: nume,: sfârșitul descrierii

Porniți serverul Solr rulând:

rază de soare: solr: începe

Sunspot indexează înregistrările noi pe care le creați, dar dacă aveți deja unele înregistrări în baza de date, executați razele soarelui rake: reindex pentru a le indexa.

Apoi adăugăm codul în controlerul Products, care va lua intrarea utilizatorului și îl va transmite motorului de căutare. În codul de mai jos, sunăm căutare pe modelul Produs și treceți într-un bloc. Noi numim text complet în bloc și treceți în șirul de interogări pe care dorim să îl căutăm. Există mai multe metode pe care le putem folosi aici pentru a specifica rezultatele căutării pe care le dorim. Rezultatele căutării sunt apoi atribuite @produse care vor fi disponibile pentru viziunea noastră.

def index @query = Product.search paramică fulltext [: căutare] end @products = @ query.results end

Rulați aplicația și acum ar trebui să puteți căuta prin produsele disponibile. 

Solr va face o căutări insensibile la litere mici prin numele și descrierile produselor utilizând cuvântul sau expresia de intrare. Puteți face ca un câmp să aibă o greutate mai mare decât celălalt pentru a îmbunătăți relevanța rezultatelor căutării. Acest lucru se face cu impuls metoda care este trecută o valoare care determină prioritatea atribuită câmpurilor diferite. Câmpul cu cea mai mare valoare va avea o importanță mai mare. 

În cererea noastră, putem specifica produsele care au șirul căutat în numele lor pentru a fi marcate mai sus. Facem acest lucru făcând următoarele modificări /models/product.rb.

se poate căuta text: nume,: stimulează => 2 text: descriere sfârșit

Reindexați înregistrările cu razele soarelui rake: reindex iar acum rezultatele cu termenul căutat în numele produsului vor fi plasate mai mari decât cele cu termenul din descriere. Puteți adăuga mai multe înregistrări pentru a testa acest lucru.

Făcând browsing

Făcând browserea este o modalitate de navigare a datelor de căutare prin diferite seturi de atribute asociate. De exemplu, în aplicația noastră, putem clasifica căutările pentru produse în funcție de intervalul de prețuri și putem da rezultate din fiecare interval.

Mai întâi adăugați un preț la căutare metoda în /models/product.rb

se pot căuta text: nume,: stimulează => 2 text: descriere dublu: sfârșitul prețului

Apoi sunați faţetă în controler. Produsele vor fi fatete după intervalul prețului lor în intervale de 100,00 $. Aici presupunem că toate produsele costă mai puțin de 500 de dolari.

def index = @query = Product.search face fulltext paramuri [: căutare] facet: price,: range => 0 ... 500,: range_interval => 100 cu (: price, Range.new (* params [: price_range] .split "...") .map (&: to_i))) dacă parametrii [: price_range] .present? end @products = @ query.results final

În fișierul de vizualizare, lipiți următoarele în locul în care doriți să vedeți rezultatele complexe.

rezultatele cautarii

    <% for row in @query.facet(:price).rows %>
  • <% if params[:price_range].blank? %> <%= link_to row.value, :price_range => row.value,: search => params [: căutare]%> (<%= row.count %>) <% else %> <%= row.value %> (<%= link_to "X", :price_range => nil%>) <% end %>
  • <% end %>

Acum, atunci când căutați un termen, va exista o listă de fațete care arată numărul rezultatelor din fiecare interval de preț. În aplicația noastră de exemplu, dacă căutați cuvântul "cameră", veți vedea următoarea listă.

100,0 ... 200,0 (2) 200,0 ... 300,0 (1) 300,0 ... 400,0 (1)

Fiecare element este un link și când faceți clic pe el, veți obține o listă cu produsele care îndeplinesc termenul de căutare și care se încadrează și în intervalul de prețuri pe care ați făcut clic. 

Linkul trece interogarea de căutare originală și intervalul ales la acțiunea index. Deoarece trece gama ca un șir, folosim Range.new (* params [: price_range] .split ("...") .map (&: to_i) pentru ao converti într-o gamă. Ați putea folosi declarații condiționale pentru a afișa mai multe linkuri ușor de utilizat, cum ar fi $ 100 - $ 199 (2) in loc de 100,0 ... 200,0 (2) dar nu vom intra aici.

Configurații avansate

Există câteva configurații pe care le puteți face pe Solr pentru a personaliza modul în care funcționează. În mod implicit, Sunspot efectuează căutarea full-text împărțind șirul de căutare în token-uri bazate pe spații albe și alte caractere de delimitator, folosind un token inteligent numit StandardTokenizer. Apoi, jetoanele sunt îndoite și sunt căutate cuvintele exacte.

Acest lucru ar putea fi bine uneori, dar este posibil să doriți să configurați motorul de căutare pentru a permite erori umane sau pentru a permite interogări care nu sunt prea stricte. De exemplu, este posibil să doriți să furnizați anumite sinonime motorului, astfel încât atunci când utilizatorul nu introduce textul exact care se află în înregistrările dvs., aceștia ar putea găsi în continuare rezultate similare. Un exemplu de acest lucru este că ați putea avea un articol etichetat "ipod" în înregistrările dvs. Puteți oferi sinonime precum "iPod", "i-pod" și "i pod" pentru a spori șansele utilizatorilor de a găsi datele.

O altă funcționalitate utilă pe care ați putea-o adăuga este stopming, ceea ce va permite Solrului să potrivească cuvinte diferite cu aceeași rădăcină. De exemplu, dacă utilizatorul a introdus "rula", s-ar obține rezultate cu "run" și "running". Sau dacă au căutat "plimbare", rezultatele vor include date care conțin "mers pe jos", "mers pe jos", "mers pe jos", și așa mai departe.

Setările Solr sunt găsite în Solr / conf / schema.xml și acesta este fișierul de modificat pentru a modifica configurația serverului. Acest lucru nu face parte din acest tutorial, dar pentru mai multe informații, consultați postul de configurare completă completă și wiki-ul Solr.

Concluzie

Acum, pentru a termina, opriți serverul Solr rulând:

raza de soare: solr: stop

Am analizat modul de utilizare a bijuteriei Sunspot pentru a utiliza motorul de căutare Solr într-o aplicație Rails. Pe lângă setările pe care le-am folosit, există multe altele pe care le puteți utiliza pentru a personaliza rezultatele căutării. Asigurați-vă că ați verificat fișierul Readme pentru mai multe opțiuni.

Solr vă oferă un fel de capacitate de căutare care nu este ușor de realizat cu interogări SQL obișnuite. Pentru aplicații simple, cu o cantitate mică de înregistrări de baze de date, interogările SQL se vor face fără prea mult succes. Dar dacă doriți ceva care este scalabil, atunci merită să te uiți în Solr sau în alte motoare de căutare disponibile.

Cod