Confronto tra il motore di ricerca full text – Lucene, Sphinx, Postgresql, MySQL?

Sto costruendo un sito Django e sto cercando un motore di ricerca.

Alcuni candidati:

  • Lucene / Lucene con Compass / Solr

  • Sfinge

  • Ricerca completa di testo integrale di Postgresql

  • MySQl ricerca integrata di testo completo

Criteri di selezione:

  • risultato pertinenza e classifica
  • ricerca e velocità di indicizzazione
  • facilità d’uso e facilità di integrazione con Django
  • requisiti di risorse – il sito sarà ospitato su un VPS , quindi idealmente il motore di ricerca non richiederebbe molta RAM e CPU
  • scalabilità
  • caratteristiche extra come “intendevi?”, ricerche correlate, ecc

Chiunque abbia avuto esperienza con i motori di ricerca sopra, o altri motori non nella lista – mi piacerebbe sentire le vostre opinioni.

EDIT: Per quanto riguarda le esigenze di indicizzazione, poiché gli utenti continuano a immettere dati nel sito, tali dati dovrebbero essere indicizzati continuamente. Non deve essere in tempo reale, ma idealmente i nuovi dati verrebbero visualizzati nell’indice con non più di 15-30 minuti di ritardo

    È bello vedere qualcuno parlare di Lucene – perché non ne ho idea.

    La Sfinge, d’altra parte, lo conosco abbastanza bene, quindi vediamo se posso essere di qualche aiuto.

    • La classifica di rilevanza del risultato è l’impostazione predefinita. È ansible impostare il proprio ordinamento, se lo si desidera, e dare campi specifici ponderazioni più elevati.
    • La velocità di indicizzazione è super veloce, perché parla direttamente al database. Qualsiasi lentezza verrà da query SQL complesse e chiavi esterne non indicizzate e altri problemi simili. Non ho mai notato alcuna lentezza nella ricerca.
    • Sono un ragazzo di Rails, quindi non ho idea di quanto sia facile da implementare con Django. C’è però un’API Python fornita con la fonte Sphinx.
    • Il daemon del servizio di ricerca (searchd) ha un consumo di memoria piuttosto basso – e puoi impostare dei limiti sulla quantità di memoria utilizzata anche dal processo dell’indicizzatore.
    • La scalabilità è dove la mia conoscenza è più schematica, ma è abbastanza facile copiare i file indice su più macchine ed eseguire diversi daemon searchd. L’impressione generale che ottengo dagli altri è che è piuttosto dannatamente buono sotto carico elevato, quindi ridimensionarlo su più macchine non è qualcosa che deve essere affrontato.
    • Non c’è supporto per “did-you-mean”, ecc. – anche se questi possono essere fatti con altri strumenti abbastanza facilmente. La Sfinge usa le parole sullo stelo usando i dizionari, quindi “guidare” e “guidare” (ad esempio) sarebbe considerato lo stesso nelle ricerche.
    • Sfinge però non consente aggiornamenti di indice parziale per i dati sul campo. L’approccio comune a questo è di mantenere un indice delta con tutte le modifiche recenti e reindicizzarlo dopo ogni modifica (e quei nuovi risultati compaiono entro un secondo o due). A causa della piccola quantità di dati, questo può richiedere un paio di secondi. Sarà comunque necessario reindicizzare il set di dati principale regolarmente (anche se quanto dipende regolarmente dalla volatilità dei dati, ogni giorno? Ogni ora?). Le veloci velocità di indicizzazione mantengono tutto questo abbastanza indolore però.

    Non ho idea di quanto sia applicabile alla tua situazione, ma Evan Weaver ha paragonato alcune delle opzioni di ricerca Rails (Sphinx, Ferret (una porta di Lucene per Ruby) e Solr), gestendo alcuni benchmark. Potrebbe essere utile, immagino.

    Non ho sondato le profondità della ricerca full-text di MySQL, ma so che non è in grado di competere in termini di velocità o di funzionalità con Sphinx, Lucene o Solr.

    Non conosco la Sfinge, ma per quanto riguarda Lucene rispetto a una ricerca full text del database, penso che le prestazioni di Lucene non abbiano eguali. Dovresti essere in grado di eseguire quasi tutte le ricerche in meno di 10 ms, indipendentemente dal numero di record che devi cercare, purché tu abbia impostato correttamente il tuo indice Lucene.

    Ecco però il più big ostacolo: personalmente, penso che l’integrazione di Lucene nel tuo progetto non sia facile . Certo, non è troppo difficile da configurare in modo da poter fare una ricerca di base, ma se vuoi ottenere il massimo da esso, con prestazioni ottimali, allora hai sicuramente bisogno di un buon libro su Lucene.

    Per quanto riguarda i requisiti di CPU e RAM, eseguire una ricerca in Lucene non incide troppo sulla tua CPU, anche se l’indicizzazione dei dati è, anche se non lo fai troppo spesso (forse una o due volte al giorno), quindi non è così molto di un ostacolo.

    Non risponde a tutte le tue domande, ma in breve, se hai molti dati da cercare e vuoi ottenere grandi risultati, allora penso che Lucene sia decisamente la strada da percorrere. Se non hai intenzione di avere tanti dati da cercare, allora potresti anche cercare una ricerca full-text nel database. L’impostazione di una ricerca full-text MySQL è decisamente più semplice nel mio libro.

    Sono sorpreso che non ci siano più informazioni pubblicate su Solr. Solr è abbastanza simile a Sphinx ma ha caratteristiche più avanzate (AFAIK come non ho usato Sphinx – solo letto su di esso).

    La risposta al link seguente descrive alcune cose su Sfinge che si applica anche a Solr. Confronto tra il motore di ricerca full text – Lucene, Sphinx, Postgresql, MySQL?

    Solr fornisce anche le seguenti funzionalità aggiuntive:

    1. Supporta la replica
    2. Core multipli (si pensi a questi come database separati con la propria configurazione e propri indici)
    3. Ricerche booleane
    4. Evidenziazione di parole chiave (abbastanza facile da fare nel codice dell’applicazione se si dispone di regex-fu, tuttavia, perché non lasciare che uno strumento specializzato faccia un lavoro migliore per te)
    5. Aggiorna indice tramite XML o file delimitato
    6. Comunica con il server di ricerca tramite HTTP (può anche restituire Json, Native PHP / Ruby / Python)
    7. PDF, indicizzazione dei documenti Word
    8. Campi dinamici
    9. sfaccettature
    10. Campi aggregati
    11. Ferma parole, sinonimi, ecc.
    12. Altro come questo …
    13. Indicizza direttamente dal database con query personalizzate
    14. Il suggerimento automatico
    15. Autobaring della cache
    16. Indicizzazione rapida (confronta con i tempi di indicizzazione della ricerca full-text di MySQL) – Lucene utilizza un formato indice invertito binario.
    17. Potenziamento (regole personalizzate per aumentare la rilevanza di una determinata parola chiave o frase, ecc.)
    18. Ricerche in campo (se un utente di ricerca conosce il campo che desidera cercare, restringe la ricerca digitando il campo, quindi il valore e SOLO quel campo viene cercato piuttosto che tutto – esperienza utente molto migliore)

    A proposito, ci sono tonnellate di altre funzionalità; tuttavia, ho elencato solo le funzionalità che ho effettivamente utilizzato nella produzione. BTW, out of the box, MySQL supporta # 1, # 3 e # 11 (limitato) nella lista sopra. Per le funzionalità che stai cercando, un database relazionale non lo taglierà. Li eliminerei subito.

    Inoltre, un altro vantaggio è che Solr (beh, in realtà Lucene) è un database di documenti (ad esempio NoSQL), quindi molti dei vantaggi di qualsiasi altro database di documenti possono essere realizzati con Solr. In altre parole, puoi usarlo per qualcosa di più della semplice ricerca (es. Performance). Diventa creativo con esso 🙂

    Apache Solr


    Oltre a rispondere alle domande dell’OP, permettetemi di gettare alcune informazioni su Apache Solr dalla semplice introduzione all’installazione e all’implementazione dettagliate .

    Introduzione semplice


    Chiunque abbia avuto esperienza con i motori di ricerca sopra, o altri motori non nella lista – mi piacerebbe sentire le vostre opinioni.

    Solr non deve essere utilizzato per risolvere problemi in tempo reale. Per i motori di ricerca, Solr è praticamente un gioco e funziona perfettamente .

    Solr funziona bene sulle applicazioni web di High Traffic ( ho letto da qualche parte che non è adatto a questo, ma sto facendo il backup di questa affermazione ). Utilizza la RAM, non la CPU.

    • risultato pertinenza e classifica

    La spinta ti aiuta a classificare i risultati in alto. Supponiamo che tu stia cercando un nome john nei campi firstname e lastname , e vuoi dare rilevanza al campo firstname , quindi devi aumentare il campo firstname come mostrato.

     http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john 

    Come puoi vedere, il campo del nome è potenziato con un punteggio di 2.

    Altro su SolrRelevancy

    • ricerca e velocità di indicizzazione

    La velocità è incredibilmente veloce e nessun compromesso. Il motivo per cui mi sono trasferito a Solr .

    Per quanto riguarda la velocità di indicizzazione, Solr può anche gestire JOINS dalle tabelle del database. Un JOIN più alto e complesso influisce sulla velocità di indicizzazione. Tuttavia, un’enorme configurazione RAM può facilmente affrontare questa situazione.

    Maggiore è la RAM, maggiore è la velocità di indicizzazione di Solr.

    • facilità d’uso e facilità di integrazione con Django

    Non hai mai tentato di integrare Solr e Django , ma puoi farlo con Haystack . Ho trovato qualche articolo interessante sullo stesso ed ecco il github per questo.

    • requisiti di risorse – il sito sarà ospitato su un VPS, quindi idealmente il motore di ricerca non richiederebbe molta RAM e CPU

    Solr si basa sulla RAM, quindi se la RAM è alta, non devi preoccuparti di Solr .

    L’ utilizzo della RAM di Solr aumenta con l’indicizzazione completa se si dispone di alcuni miliardi di record, è ansible utilizzare in modo intelligente le importazioni Delta per affrontare questa situazione. Come spiegato, Solr è solo una soluzione quasi in tempo reale .

    • scalabilità

    Solr è altamente scalabile. Dai un’occhiata a SolrCloud . Alcune caratteristiche chiave di esso.

    • Shard (o sharding è il concetto di distribuzione dell’indice tra più macchine, diciamo se il tuo indice è diventato troppo grande)
    • Load Balancing (se Solrj viene usato con Solr cloud, si occupa automaticamente del bilanciamento del carico usando il suo meccanismo Round-Robin)
    • Ricerca distribuita
    • Alta disponibilità
    • caratteristiche extra come “intendevi?”, ricerche correlate, ecc

    Per lo scenario di cui sopra, è ansible utilizzare SpellCheckComponent compresso con Solr . Ci sono molte altre caratteristiche, The SnowballPorterFilterFactory aiuta a recuperare i record che dicono se hai digitato, libri invece di libro , ti verranno presentati i risultati relativi al libro .


    Questa risposta si concentra ampiamente su Apache Solr e MySQL . Django è fuori portata.

    Supponendo che tu sia in ambiente LINUX, puoi continuare a leggere questo articolo. (la mia era una versione di Ubuntu 14.04)

    Installazione dettagliata

    Iniziare

    Scarica Apache Solr da qui . Questa sarebbe la versione 4.8.1 . Potresti scaricare nuove versioni, ho trovato stabile.

    Dopo aver scaricato l’archivio, estrailo in una cartella a tua scelta. Dì .. Downloads o qualsiasi altra cosa .. Quindi sembrerà Downloads/solr-4.8.1/

    Al tuo prompt .. Naviga all’interno della directory

    shankar@shankar-lenovo: cd Downloads/solr-4.8.1

    Quindi ora sei qui ..

    shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$

    Avvia il server applicazioni Jetty

    Il molo è disponibile all’interno della cartella degli esempi della directory solr-4.8.1 , quindi spostati all’interno di esso e avvia il server applicazioni Jetty.

    shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar

    Ora, non chiudere il terminale, minimizzarlo e lasciarlo da parte.

    (CONSIGLIO: Usa & dopo start.jar per far funzionare il Jetty Server in background)

    Per verificare se Apache Solr viene eseguito correttamente, visitare questo URL sul browser. http: // localhost: 8983 / solr

    Esecuzione di Jetty su porta personalizzata

    Funziona sulla porta 8983 come predefinito. Puoi cambiare la porta qui o direttamente all’interno del file jetty.xml .

    java -Djetty.port=9091 -jar start.jar

    Scarica il JConnector

    Questo file JAR funge da ponte tra MySQL e JDBC, Scarica qui la versione indipendente della piattaforma

    Dopo averlo scaricato, estrai la cartella e copia il mysql-connector-java-5.1.31-bin.jar e incollalo nella directory lib .

    shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

    Creazione della tabella MySQL da colbind ad Apache Solr

    Per utilizzare Solr , è necessario disporre di tabelle e dati da cercare. Per questo, useremo MySQL per creare una tabella e spingere alcuni nomi casuali e quindi potremmo usare Solr per connetterci a MySQL e indicizzare quella tabella e le sue voci.

    1. Struttura del tavolo

     CREATE TABLE test_solr_mysql ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(45) NULL, created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ); 

    2.Popolare la tabella sopra

     INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland'); 

    Entrare nel nucleo e aggiungere le direttive lib

    1. Naviga su

     shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf 

    2. Modifica del file solrconfig.xml

    Aggiungi queste due direttive a questo file ..

        

    Ora aggiungi il DIH (Data Import Handler)

       db-data-config.xml   

    3. Creare il file db-data-config.xml

    Se il file esiste, ignoralo, aggiungi queste righe a quel file. Come puoi vedere la prima riga, devi fornire le credenziali del tuo database MySQL . Nome del database, nome utente e password.

              

    (SUGGERIMENTO: puoi avere un numero qualsiasi di quadro ma fai attenzione al campo ID, se sono uguali, l’indicizzazione verrà saltata).

    4. Modificare il file schema.xml

    Aggiungi questo al tuo schema.xml come mostrato ..

     id  

    Implementazione

    indicizzazione

    Questo è dove si trova il vero affare. È necessario eseguire l’indicizzazione dei dati da MySQL a Solr inorder per utilizzare Solr Queries.

    Passo 1: vai su Solr Admin Panel

    Hit l’URL http: // localhost: 8983 / solr sul tuo browser. Lo schermo si apre in questo modo.

    Questo è il principale pannello di amministrazione di Apache Solr

    Come indicato dall’indicatore, andare su Accesso interno per verificare se una delle configurazioni precedenti ha causato errori.

    Passaggio 2: controlla i tuoi registri

    Ok, ora sei qui, Come puoi, ci sono un sacco di messaggi gialli (AVVERTENZE). Assicurati di non avere messaggi di errore contrassegnati in rosso. In precedenza, sulla nostra configurazione avevamo aggiunto una query di selezione sul nostro file db-data-config.xml , diciamo che se ci fossero stati errori in quella query, sarebbe stata visualizzata qui.

    Questa è la sezione di registrazione del tuo motore Apache Solr

    Bene, nessun errore. Siamo a posto. Scegliamo collection1 dall’elenco come raffigurato e selezionare Dataimport

    Passaggio 3: DIH (Data Import Handler)

    Usando il DIH, ti connetteresti a MySQL da Solr attraverso il file di configurazione db-data-config.xml dall’interfaccia Solr e recupererai i 10 record dal database che vengono indicizzati su Solr .

    Per fare ciò, scegli full-import e controlla le opzioni Clean and Commit . Ora fai clic su Esegui come mostrato.

    In alternativa, potresti usare una query di importazione completa diretta come questa anche ..

     http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true 

    Il gestore di importazione dei dati

    Dopo aver fatto clic su Esegui , Solr inizia a indicizzare i record, se ci fossero errori, direbbe Indicizzazione fallita e devi tornare alla sezione Registrazione per vedere cosa è andato storto.

    Supponendo che non ci siano errori con questa configurazione e che l’indicizzazione sia completata con successo, si otterrebbe questa notifica.

    Indexing Success

    Passaggio 4: esecuzione di query Solr

    Sembra che tutto sia andato a buon fine, ora è ansible utilizzare Solr Queries per interrogare i dati che sono stati indicizzati. Fare clic sulla query a sinistra e quindi premere il pulsante Execute in basso.

    Vedrai i record indicizzati come mostrato.

    La query Solr corrispondente per elencare tutti i record è

     http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true 

    I dati indicizzati

    Bene, ci sono tutti e 10 i record indicizzati. Diciamo, abbiamo bisogno solo di nomi che iniziano con Ja , in questo caso, è necessario scegliere come target il nome della colonna solr_name , quindi la query va in questo modo.

     http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true 

    I dati JSON che iniziano con Ja *

    È così che scrivi Solr Queries. Per saperne di più, controlla questo bellissimo articolo .

    Sto guardando la ricerca full-text di PostgreSQL in questo momento, e ha tutte le giuste caratteristiche di un moderno motore di ricerca, un carattere esteso davvero buono e supporto multilingue, una buona integrazione con i campi di testo nel database.

    Ma non ha operatori di ricerca user-friendly come + o AND (usa & |!) E non sono entusiasta di come funziona sul loro sito di documentazione. Mentre ha grassetto di termini di corrispondenza nei frammenti di risultati, l’algoritmo predefinito per cui i termini di corrispondenza non è grande. Inoltre, se si desidera indicizzare rtf, PDF, MS Office, è necessario trovare e integrare un convertitore di formati di file.

    OTOH, è molto meglio della ricerca di testo MySQL, che non indicizza nemmeno le parole di tre lettere o meno. È l’impostazione predefinita per la ricerca MediaWiki e penso davvero che non vada bene per gli utenti finali: http://www.searchtools.com/analysis/mediawiki-search/

    In tutti i casi che ho visto, Lucene / Solr e Sphinx sono davvero grandiosi . Sono codice solido e si sono evoluti con significativi miglioramenti nell’usabilità, quindi gli strumenti sono tutti lì per fare ricerca che soddisfa quasi tutti.

    per SHAILI – SOLR include la libreria di codici di ricerca Lucene e ha i componenti per essere un bel motore di ricerca autonomo.

    Solo i miei due centesimi per questa domanda molto vecchia. Consiglio vivamente di dare un’occhiata a ElasticSearch .

    Elasticsearch è un server di ricerca basato su Lucene. Fornisce un motore di ricerca full-text distribuito e multi-tenant con un’interfaccia web RESTful e documenti JSON senza schema. Elasticsearch è sviluppato in Java ed è rilasciato come open source secondo i termini della licenza Apache.

    I vantaggi rispetto agli altri motori FTS (ricerca a testo integrale) sono:

    • Interfaccia RESTful
    • Migliore scalabilità
    • Grande comunità
    • Costruito dagli sviluppatori Lucene
    • Ampia documentazione
    • Ci sono molte librerie open source disponibili (incluso Django)

    Stiamo utilizzando questo motore di ricerca nel nostro progetto e ne siamo molto soddisfatti.

    SearchTools-Avi ha detto “Ricerca di testo MySQL, che non indicizza nemmeno le parole di tre lettere o meno.”

    FYI, la lunghezza minima della parola minima MySQL è regolabile almeno da MySQL 5.0. Google ‘mysql fulltext min length’ per semplici istruzioni.

    Detto questo, il testo completo di MySQL presenta dei limiti: per uno, diventa lento aggiornarlo una volta raggiunto un milione di record o giù di lì, …

    Vorrei aggiungere mnoGoSearch alla lista. Soluzione estremamente performante e flessibile, che funziona come Google: l’indicizzatore recupera dati da più siti, puoi utilizzare criteri di base o inventare i tuoi ganci per avere la massima qualità di ricerca. Inoltre potrebbe recuperare i dati direttamente dal database.

    La soluzione non è così conosciuta oggi, ma soddisfa i massimi bisogni. Potresti compilarlo e installarlo o su server standalone, o anche sul tuo server principale, non ha bisogno di così tante risorse come Solr, dato che è scritto in C e funziona perfettamente anche su server di piccole dimensioni.

    All’inizio Hai bisogno di compilarlo da solo, quindi richiede una certa conoscenza. Ho creato una piccola sceneggiatura per Debian, che potrebbe aiutare. Qualsiasi adeguamento è benvenuto.

    Poiché stai usando il framework Django, potresti usare o client PHP nel mezzo, o trovare una soluzione in Python, ho visto alcuni articoli .

    E, ovviamente, mnoGoSearch è open source, GNU GPL.