Vi kanske har hört talas om många ädelstenar som låter oss implementera sökfunktioner i vår rails-applikation; till exempel: searchkick, elasticsearch-rails, ransack och slutligen solfläck för att arbeta med solr sökmotor. Alla dessa pärlor har sina egna fördelar. Både searchkick och elasticsearch använder redis för att söka i data samt behöver utföra en "omindexering" samtidigt som ny data infogas. I ett av mina senaste projekt råkade jag använda en pärla som heter Textacular. Det är enkelt och väldigt lätt att använda.
Textakulär pärla:
Det är en pärla som ger fulltextsökningsmöjligheter för PostgreSQL-databasen. Det syftar i princip till att utöka omfattningen av det arbete som utförs av activerecord, på ett ganska vänligt sätt. Det fungerar på heroku också. Denna pärla fungerar bara på PostgreSQL För att arbeta med den, låt oss först ta den senaste textakulära pärlan från https://rubygems.org/gems/textacular och lägga till den i gemfilen.pärla 'textacular' paketinstallation
Textacular gem ger oss en hel del metoder för att söka i data. Så alla våra modeller har tillgång att använda dessa metoder.
basic_search advanced_search fuzzy_search
Användande:
Basic_search: Den söker baserat på inmatad text.
User.basic_search('abc') # Söker på alla modellkolumnattribut
User.basic_search(efternamn: 'abc', förnamn: 'xyz')
Avancerad sökning: Här kan vi använda postgres-syntaxer som !, & och | (och, eller och, inte) och sedan några andra baserat på kravet. Den konverterar användarens sök-DSL till Pg-syntax. För detta måste vi se till att nödvändiga undantag bör användas för att hantera syntaxfel.
User.advanced_search(last_name: 'text1|text2') - Den söker med text1 eller text2 på last_name på användarmodell.
User.advanced_search(last_name: '!text2') - Den söker efter poster vars efternamn inte är text2.
Dessa sökningar kan vara kedjabara enligt nedan:
User.advanced_search(last_name: 'text1|text2').basic_search(last_name: 'abc', first_name: 'xyz')
Fuzzy_search:
Vi måste installera pg_trgm-modulen för att fungera med fuzzy_search. Kör kommandot nedan för att installera denna modul. Den söker efter delvis utseende av din text i DB.
rake textacular:create_trigram_migration rake db:migrate
Nu är vi redo att använda fuzzy_search.
User.fuzzy_search('Lorem')
Som standard söker fuzzy search efter posterna som är 30% av söktexten matchar med avseende på hela innehållet. Vi kan ställa in denna tröskelgräns genom att använda kommandot nedan.
ActiveRecord::Base.connection.execute("SELECT set_limit(0.6);")
Så den förväntar sig att 60% söktext matchar det ursprungliga innehållet. Vi kan använda OR-villkor för att söka på flera kolumner. Behöver skicka en hash med kolumner med inmatad text som param ett och skicka andra param som falsk. Det tar OCH, om du missar andra paramet eller om det är sant.
User.fuzzy_search({first_name: 'user', last_name: 'test'}, false)
User.fuzzy_search(first_name: 'user', last_name: 'test') - Det tar AND condition.
Som standard söker Textacular i alla text- och strängkolumner. Vi kan ändra dess standardbeteende genom att åsidosätta metoden searchable_columns i modellen.
def self.searchable_columns [:titel, :kropp] slut
Vi kan åsidosätta self.searchable_language i modellen för att ställa in korrekta ordboksinställningar.
def self.searchable_language 'arabic' end
Vänligen kontrollera gem officiella dokument för global sökning och mer. Prenumerera för de senaste uppdateringarna
relaterade inlägg