Potremmo aver sentito parlare di molte gemme che ci consentono di implementare funzionalità di ricerca nella nostra applicazione ferroviaria; ad esempio: searchkick, elasticsearch-rails, ransack e infine sunspot per lavorare con il motore di ricerca solr. Tutte queste gemme hanno i loro vantaggi. Sia searchkick che elasticsearch utilizzano redis per cercare i dati e devono eseguire una "reindicizzazione" durante l'inserimento di nuovi dati. In uno dei miei progetti recenti, mi è capitato di utilizzare una gemma chiamata Textacular. È semplice e molto facile da usare.
Gemma textacolare:
È un gioiello che fornisce funzionalità di ricerca full-text per il database PostgreSQL. Fondamentalmente si propone di estendere la portata del lavoro svolto da activerecord, in un modo piuttosto amichevole. Funziona anche su Heroku. Questo gem funziona solo su PostgreSQL Per lavorare con esso, prendiamo prima l'ultimo gem textacular da https://rubygems.org/gems/textacular e aggiungiamolo al gemfile.installazione del bundle gem 'textacular'
La gemma textacular ci fornisce diversi metodi per cercare i dati. Quindi, tutti i nostri modelli hanno accesso per utilizzare questi metodi.
ricerca_base ricerca_avanzata ricerca_fuzzy
Utilizzo:
Ricerca_base: La ricerca avviene in base al testo immesso.
User.basic_search('abc') # Cerca tutti gli attributi delle colonne del modello
User.basic_search(cognome: 'abc', nome: 'xyz')
Ricerca Avanzata: Qui possiamo usare le sintassi postgres come!, & e | (e, o e, non) e poi, alcuni altri in base al requisito. Converte la ricerca DSL dell'utente nella sintassi Pg. Per questo, dobbiamo assicurarci che vengano utilizzate le eccezioni necessarie per gestire gli errori di sintassi.
User.advanced_search(last_name: 'text1|text2') - Cerca con text1 o text2 su last_name sul modello User.
User.advanced_search(last_name: '!text2') - Cerca i record il cui cognome non è text2.
Queste ricerche possono essere concatenabili come mostrato di seguito:
User.advanced_search(cognome: 'testo1|testo2').basic_search(cognome: 'abc', nome: 'xyz')
Ricerca_fuzzy:
Dobbiamo installare il modulo pg_trgm per funzionare con fuzzy_search. Esegui il comando seguente per installare questo modulo. Cerca la comparsa parziale del testo nel DB.
rake textacular:create_trigram_migration rake db:migrate
Ora siamo pronti per utilizzare fuzzy_search.
Utente.fuzzy_search('Lorem')
Per impostazione predefinita, la ricerca fuzzy ricerca i record che corrispondono al testo di ricerca 30% rispetto all'intero contenuto. Possiamo impostare questo limite di soglia utilizzando il comando seguente.
ActiveRecord::Base.connection.execute("SELECT set_limit(0.6);")
Pertanto, si prevede che 60% del testo di ricerca corrisponda al contenuto originale. Possiamo utilizzare la condizione OR per cercare su più colonne. È necessario passare un hash con colonne con testo di input come parametro uno e passare il secondo parametro come falso. Ci vuole AND, se perdi il secondo parametro o se è vero.
User.fuzzy_search({nome: 'utente', cognome: 'test'}, false)
User.fuzzy_search(first_name: 'user', last_name: 'test') - Richiede la condizione AND.
Per impostazione predefinita, Textacular effettua la ricerca in tutte le colonne di testo e di stringhe. Possiamo modificare il suo comportamento predefinito sovrascrivendo il metodo searchable_columns nel modello.
def self.colonne_cercabili [:titolo, :corpo] end
Possiamo sovrascrivere self.searchable_lingual nel modello per impostare le impostazioni corrette del dizionario.
def self.searchable_lingual 'arabo' end
Controlla i documenti ufficiali di Gem per la ricerca globale e altro ancora. Iscriviti per gli ultimi aggiornamenti
Articoli correlati