La ricerca di record è un requisito comune nelle applicazioni web. Di solito è necessario consentire agli utenti di accedere rapidamente ai dati desiderati da record di grandi dimensioni. Mentre è possibile farlo utilizzando semplici query SQL, a volte è più efficiente utilizzare un motore di ricerca.
Solr è una piattaforma di ricerca popolare del progetto Apache Lucene. Le sue caratteristiche principali includono una potente ricerca full-text, l'evidenziazione dei risultati, la ricerca sfaccettata, l'indicizzazione quasi in tempo reale, il clustering dinamico, l'integrazione del database, la gestione avanzata dei documenti e la ricerca geospaziale. In questo tutorial, considereremo l'esecuzione della ricerca full-text con Sunspot, una libreria che consente l'integrazione di Solr nelle applicazioni ruby.
Ho creato una semplice app su Github che userò qui invece di iniziare con un nuovo progetto. L'app mostra un elenco di prodotti con il loro nome, immagine, prezzo e descrizione. Ho incluso alcuni dati seme in modo da poter eseguire rake db: seed
se non vuoi inserire i dati da solo. L'applicazione utilizza Paperclip per gli allegati di immagini e poiché utilizzo il ridimensionamento delle immagini, è necessario che ImageMagick sia installato sul sistema. Richiederai inoltre il runtime Java installato sulla tua macchina per procedere con il tutorial.
L'immagine sotto mostra l'applicazione. Il modulo di ricerca in alto non fa nulla al momento, ma consentiremo a un utente di cercare tra i prodotti e ottenere risultati basati non solo sul nome del prodotto, ma anche sulla sua descrizione.
Inizieremo includendo le gemme Sunspot e Solr nel nostro Gemfile. Per lo sviluppo, useremo il sunspot_solr
gemma che viene fornito con una distribuzione Solr preconfezionata, quindi non avremo bisogno di installarlo separatamente.
gem 'sunspot_rails' group: sviluppo do gem 'sunspot_solr' fine
Correre installazione bundle
e quindi eseguire il seguente comando per generare il file di configurazione di Sunspot.
rails genera sunspot_rails: installa
Questo crea il /config/sunspot.yml
file che consente alla tua app di sapere dove trovare il server Solr.
Per impostare gli oggetti da indicizzare, aggiungi un blocco ricercabile agli oggetti. Nel progetto iniziale, abbiamo un modello di prodotto con nome, prezzo, descrizione e campi fotografici. Abiliteremo una ricerca full-text sui campi nome e descrizione. Nel /models/product.rb
Inserisci:
testo ricercabile: nome, descrizione fine
Avvia il server Solr eseguendo:
rake sunspot: solr: start
Sunspot indicizza i nuovi record che crei, ma se hai già alcuni record nel database, esegui rake sunspot: reindex
per indicizzarli.
Quindi aggiungiamo il codice nel controller Prodotti che prenderà l'input dell'utente e lo passerà al motore di ricerca. Nel codice qui sotto, chiamiamo ricerca
sul modello del prodotto e passare in un blocco. Chiamiamo il testo intero
metodo nel blocco e passare la stringa di query che vogliamo cercare. Ci sono diversi metodi che possiamo usare qui per specificare i risultati di ricerca che vogliamo. I risultati della ricerca vengono quindi assegnati a @prodotti
che sarà disponibile per la nostra vista.
def index @query = Product.search fa fulltext params [: search] end @products = @ query.results end
Esegui l'applicazione e ora dovresti riuscire a cercare tra i prodotti disponibili.
Solr eseguirà una ricerca senza distinzione tra maiuscole e minuscole attraverso i nomi e le descrizioni dei prodotti utilizzando la parola o la frase introduttiva. Puoi rendere un campo più importante dell'altro per migliorare la pertinenza dei tuoi risultati di ricerca. Questo è fatto con il Incremento
metodo che viene passato un valore che determina la priorità assegnata ai diversi campi. Il campo con il valore più alto avrà più importanza.
Nella nostra applicazione, possiamo specificare i prodotti in cui la stringa cercata nel loro nome deve essere valutata più in alto. Lo facciamo apportando le seguenti modifiche /models/product.rb
.
testo ricercabile: nome,: boost => 2 testo: descrizione fine
Reindicizzare i record con rake sunspot: reindex
e ora i risultati con il termine cercato nel nome del prodotto, saranno posizionati più in alto di quelli con il termine nella descrizione. Puoi aggiungere più record per testarlo.
La navigazione sfaccettata è un modo di navigare tra i dati di ricerca tramite vari insiemi di attributi associati. Ad esempio, nella nostra applicazione, possiamo classificare le ricerche di prodotti per fascia di prezzo e fornire i conteggi di ogni intervallo.
In primo luogo aggiungere il prezzo al ricercabile
metodo in /models/product.rb
testo ricercabile: nome,: boost => 2 testo: descrizione double: price end
Quindi chiama sfaccettatura
nel controller. I prodotti saranno sfaccettati dalla gamma del loro prezzo in intervalli di $ 100,00. Qui assumiamo che tutti i prodotti costino meno di $ 500.
def index @query = Product.search do fulltext params [: search] facet: price,: range => 0 ... 500,: range_interval => 100 con (: price, Range.new (* params [: price_range] .split ( "...") .map (&: to_i))) if params [: price_range] .present? end @products = @ query.results end
Nel file di visualizzazione, incollare quanto segue nel punto in cui si desidera visualizzare i risultati sfaccettati.
risultati di ricerca
<% 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 => nil%>) <% end %>
<% end %>
Ora quando cerchi un termine, ci sarà un elenco di faccette che mostrano quanti risultati ci sono in ogni fascia di prezzo. Nella nostra applicazione di esempio, se cerchi la parola "camera", vedrai il seguente elenco.
100.0 ... 200.0 (2) 200.0 ... 300.0 (1) 300.0 ... 400.0 (1)
Ogni articolo è un collegamento e quando viene cliccato, si ottiene un elenco dei prodotti che soddisfano il termine di ricerca e che rientrano anche nella fascia di prezzo su cui si è fatto clic.
Il collegamento passa la query di ricerca originale e l'intervallo selezionato all'azione indice. Dal momento che passa l'intervallo come una stringa, usiamo Range.new (* params [: price_range] .split ("...") .map (&: to_i))
per riconvertirlo in un intervallo. Potresti usare le istruzioni condizionali per generare link più user friendly come $ 100 - $ 199 (2)
invece di 100,0 ... 200,0 (2)
ma non entreremo in quello qui.
Ci sono alcune ulteriori configurazioni che puoi fare su Solr per personalizzare come funziona. Nella sua impostazione predefinita, Sunspot esegue la ricerca full-text dividendo la stringa di ricerca in token basati su spazi bianchi e altri caratteri di delimitazione utilizzando un tokenizzatore intelligente chiamato StandardTokenizer
. Quindi i token sono inferiori e vengono cercate le parole esatte.
A volte potrebbe essere ok, ma potresti anche voler configurare il motore di ricerca in modo da consentire l'errore umano o consentire l'esecuzione di query non troppo rigide. Ad esempio, potresti voler fornire alcuni sinonimi al motore in modo che quando l'utente non immette il testo esatto presente nei tuoi record, potrebbero comunque trovare risultati simili. Un esempio di questo è che potresti avere un articolo etichettato "ipod" nei tuoi archivi. Puoi fornire sinonimi come "iPod", "i-pod" e "i pod" per aumentare le probabilità che gli utenti trovino i dati.
Un'altra funzionalità utile che è possibile aggiungere è la derivazione, che consentirà a Solr di associare parole diverse con la stessa radice. Ad esempio, se l'utente ha inserito "Esegui", otterrebbe risultati con "Esegui" e "In esecuzione". Oppure, se hanno cercato "walk", i risultati includeranno i dati che contengono "walk", "walking", "walked" e così via.
Le impostazioni di Solr sono disponibili in solr / conf / schema.xml
e questo è il file da modificare per cambiare la configurazione del server. Questo è fuori dallo scopo di questo tutorial, ma per ulteriori informazioni, controlla il post di configurazione full-text avanzato e il wiki Solr.
Ora per finire, arrestare il server Solr eseguendo:
rake sunspot: solr: stop
Abbiamo esaminato come utilizzare la gemma Sunspot per utilizzare il motore di ricerca Solr in un'app Rails. Oltre alle impostazioni che abbiamo utilizzato, ci sono molti altri che puoi usare per personalizzare i risultati della tua ricerca. Assicurati di controllare il file Leggimi per ulteriori opzioni.
Solr ti offre il tipo di capacità di ricerca che non è facile da ottenere con le normali query SQL. Per le app semplici, con una piccola quantità di record di database, le query SQL eseguiranno senza un grande calo di prestazioni. Ma se vuoi qualcosa che sia scalabile, allora vale la pena guardare in Solr o in altri motori di ricerca disponibili.