Confronto del motore di ricerca full-text - Lucene, Sphinx, Postgresql, MySQL?


312

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

Alcuni candidati:

  • Lucene / Lucene con Compass / Solr

  • Sfinge

  • Ricerca full-text integrata in Postgresql

  • Ricerca full-text integrata in MySQl

Criteri di selezione:

  • pertinenza e classifica dei risultati
  • velocità di ricerca e 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à
  • funzioni extra come "intendevi?", ricerche correlate, ecc

Chiunque abbia avuto esperienza con i motori di ricerca sopra, o altri motori non presenti nell'elenco - mi piacerebbe sentire le tue 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


26
2 ¢: la ricerca full-text di MySQL e le transazioni si escludono a vicenda. Gli indici full-text di MySQL richiedono il tipo di tabella MyISAM, che non supporta le transazioni. (A differenza del tipo di tabella InnoDB che supporta le transazioni, ma non gli indici full-text.)
Carl G

2
La ricerca full-text PostgreSQL Tsearch non supporta la ricerca di frasi. Tuttavia, è nella lista TODO sai.msu.su/~megera/wiki/FTS_Todo .
Gnanam,

1
Chiunque guardi questo per Django dovrebbe dare un'occhiata all'app del pagliaio. haystacksearch.org
Keyo,


24
@CarlG, solo per riferimento di tutti. MySQL 5.6+ ha il supporto per la ricerca di testo completo con motore
innodb

Risposte:


167

È bello vedere qualcuno intervenuto su Lucene, perché non ne ho idea.

La Sfinge, invece, lo so abbastanza bene, quindi vediamo se posso esserti di aiuto.

  • La classificazione per pertinenza dei risultati è l'impostazione predefinita. Se lo si desidera, è possibile impostare il proprio ordinamento e assegnare a campi specifici ponderazioni più elevate.
  • La velocità di indicizzazione è superveloce, perché comunica direttamente con il database. Qualsiasi lentezza arriverà da complesse query SQL, 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 implementarlo con Django. Esiste però un'API Python fornita con l'origine Sphinx.
  • Il daemon del servizio di ricerca (searchd) ha un consumo di memoria piuttosto basso e puoi anche impostare limiti sulla quantità di memoria utilizzata dal processo dell'indicizzatore.
  • La scalabilità è dove la mia conoscenza è più imprecisa, ma è abbastanza facile copiare i file di indice su più macchine ed eseguire diversi daemon di ricerca. L'impressione generale che ricevo dagli altri è che è dannatamente buono sotto carico elevato, quindi ridimensionarlo su più macchine non è qualcosa che deve essere affrontato.
  • Non c'è supporto per "did-you-mean", ecc., Sebbene questi possano essere fatti con altri strumenti abbastanza facilmente. Sphinx usa parole vocali anche se utilizza dizionari, quindi "guida" e "guida" (per esempio) verrebbero considerati uguali nelle ricerche.
  • Sphinx non consente tuttavia aggiornamenti parziali dell'indice per i dati sul campo. L'approccio comune a questo è mantenere un indice delta con tutte le modifiche recenti e reindicizzare questo dopo ogni modifica (e quei nuovi risultati compaiono entro un secondo o due). A causa della piccola quantità di dati, questa operazione può richiedere alcuni secondi. Dovrai comunque reindicizzare regolarmente il set di dati principale (anche se quanto dipende regolarmente dalla volatilità dei tuoi dati - ogni giorno? Ogni ora?). Le elevate velocità di indicizzazione mantengono tutto questo abbastanza indolore.

Non ho idea di quanto applicabile alla tua situazione, ma Evan Weaver ha confrontato alcune delle opzioni di ricerca comuni di Rails (Sphinx, Ferret (un porto di Lucene per Ruby) e Solr), eseguendo alcuni benchmark. Potrebbe essere utile, immagino.

Non ho approfondito la profondità della ricerca full-text di MySQL, ma so che non è in concorrenza con la velocità né la funzionalità con Sphinx, Lucene o Solr.


Sphinx ti consente di aggiornare i singoli attributi degli elementi negli indici correnti, ma non di rimuovere / aggiornare i record completi.
Xorlev,

sphinx RT ti consente di eseguire aggiornamenti / rimozioni parziali. è in fase iniziale ma già [quasi] funziona. sphinxsearch.com/wiki/doku.php?id=rt_tutorial
pQd

4
Ecco una risposta su Solr che è una buona coppia per questa risposta su Sfinge
New Alexandria,

Nulla può eguagliare Sphinx per la velocità, quindi se la velocità è la tua preoccupazione numero uno, Sphinx è l'opzione da scegliere. Bel post
twigg

Sphinx 2.3.2 Beta ha ora una funzione chiamata "CALL SUGGEST" che può essere utilizzata per implementare "intendevi?" sphinxsearch.com/docs/devel.html#sphinxql-call-suggest
Vinod K

82

Non conosco Sphinx, ma per quanto riguarda Lucene rispetto a una ricerca full-text nel 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 da quanti record devi cercare, a condizione che tu abbia impostato correttamente il tuo indice Lucene.

Ecco il grande ostacolo però: personalmente, penso che integrare Lucene nel tuo progetto non sia facile . Certo, non è troppo difficile configurarlo in modo da poter fare qualche 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 è un compito eccessivo per la CPU, anche se l'indicizzazione dei dati lo è, anche se non lo fai troppo spesso (forse una o due volte al giorno), quindi non lo è molto di ostacolo.

Non risponde a tutte le tue domande, ma in breve, se hai molti dati da cercare e desideri grandi prestazioni, penso che Lucene sia sicuramente la strada da percorrere. Se non hai molti dati da cercare, potresti anche cercare un database di ricerca full-text. Configurare una ricerca full-text su MySQL è decisamente più semplice nel mio libro.


10
Paragonato alla sfinge, il lucence è troppo lento e voluminoso. Avevo usato entrambi nel mio progetto e alla fine mi sono attaccato alla sfinge. Lucence è in Java e richiede molta più CPU e RAM di Sphinx.
Phyo Arkar Lwin,

25
Non sono d'accordo qui. Lucene è velocissima se costruisci un indice corretto. In pratica puoi eseguire una query avanzata su milioni di record in un paio di millisecondi. Devi solo sapere cosa stai facendo. E Lucene è a Java ... il tuo punto è? C'è anche la porta .NET, Lucene.NET tra l'altro.
Razzie,

15
ma hai affermato chiaramente che non usi la sfinge e v3sson ha usato entrambi.
user508546

20
come puoi affermare che la performance di lucene non ha eguali nella stessa frase in cui affermi di non aver usato la sfinge?
user508546

22
Domande valide Non ho mai detto che Lucene sia più veloce di Sphinx, ho detto che Lucene rispetto a una ricerca full-text nel database non ha eguali. E questo è. Nessuna domanda al riguardo. Lucene si basa su un indice invertito. Ora non conosco Sphinx, come accennato prima, ma se utilizza anche un indice invertito o un metodo di indicizzazione simile, è possibile che funzionino allo stesso modo. Affermare che Lucene, rispetto alla Sfinge, sarebbe "troppo lento e voluminoso" non si basa sui fatti. Soprattutto quando si dice solo che Lucene è in "Java", che è solo un ridicolo non-problema in termini di prestazioni.
Razzie,

60

Sono sorpreso che non ci siano più informazioni pubblicate su Solr. Solr è abbastanza simile a Sphinx ma ha funzionalità più avanzate (AFAIK in quanto non ho usato Sphinx - ne ho solo letto).

La risposta al link qui sotto dettaglia alcune cose su Sphinx che si applica anche a Solr. Confronto del motore di ricerca full-text - Lucene, Sphinx, Postgresql, MySQL?

Solr offre anche le seguenti funzionalità aggiuntive:

  1. Supporta la replica
  2. Core multipli (pensate a questi come database separati con la propria configurazione e i propri indici)
  3. Ricerche booleane
  4. Evidenziazione delle 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. Comunicare con il server di ricerca tramite HTTP (può persino restituire Json, PHP / Ruby / Python nativi)
  7. PDF, indicizzazione di documenti Word
  8. Campi dinamici
  9. sfaccettature
  10. Campi aggregati
  11. Ferma parole, sinonimi, ecc.
  12. Più come questo ...
  13. Indicizza direttamente dal database con query personalizzate
  14. Il suggerimento automatico
  15. Inserimento automatico della cache
  16. Indicizzazione rapida (confronta con i tempi di indicizzazione della ricerca full-text di MySQL): Lucene utilizza un formato di indice binario invertito.
  17. Potenziamento (regole personalizzate per aumentare la pertinenza di una determinata parola chiave o frase, ecc.)
  18. Ricerche sul 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 anziché tutto, un'esperienza utente molto migliore)

A proposito, ci sono molte più funzioni; tuttavia, ho elencato solo le funzionalità che ho effettivamente utilizzato in produzione. A proposito, MySQL supporta # 1, # 3 e # 11 (limitato) nell'elenco precedente. Per le funzionalità che stai cercando, un database relazionale non lo taglierà. Eliminerei subito quelli.

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 più di una semplice ricerca (ad es. Performance). Diventa creativo :)


Sphinx about Supporta la replica Più core Ricerche booleane Evidenziazione delle parole chiave Aggiorna indice tramite XML -o file delimitato- PDF, indicizzazione di documenti Word (via xml) Sfaccettature Ferma parole, sinonimi, ecc. Indice direttamente dal database con query personalizzate Suggerimento automatico Veloce indicizzazione Boosting Ricerche sul campo A proposito di campi dinamici Campi aggregati Cache Autowarming Non so proprio
Moosh

58

Apache Solr


Oltre a rispondere alle domande di OP, Permettetemi di gettare un po 'intuizioni su Apache Solr dalla semplice introduzione di installazione dettagliata e implementazione .

Introduzione semplice


Chiunque abbia avuto esperienza con i motori di ricerca sopra, o altri motori non presenti nell'elenco - mi piacerebbe sentire le tue opinioni.

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

Solr funziona bene su applicazioni Web ad alto traffico ( ho letto da qualche parte che non è adatto a questo, ma sto eseguendo il backup di tale affermazione ). Utilizza la RAM, non la CPU.

  • pertinenza e classifica dei risultati

Il boost ti aiuta a classificare i risultati in cima. Supponiamo che tu stia cercando un nome john nei campi nome e cognome e desideri dare rilevanza al campo nome , quindi devi aumentare il campo nome come mostrato.

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

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

Altro su SolrRelevancy

  • velocità di ricerca e indicizzazione

La velocità è incredibilmente veloce e nessun compromesso su questo. 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 provato a integrare Solr e Django , tuttavia puoi farlo con Haystack . Ho trovato un 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 cresce su RAM, quindi se la RAM è alta, non devi preoccuparti di Solr .

L' utilizzo della RAM da parte di Solr aumenta in base all'indicizzazione completa se si dispone di alcuni miliardi di record, è possibile 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.

  • Shards (o sharding è il concetto di distribuzione dell'indice tra più macchine, ad esempio se l'indice è cresciuto troppo)
  • Bilanciamento del carico (se Solrj viene utilizzato con Solr cloud si occupa automaticamente del bilanciamento del carico utilizzando il meccanismo Round-Robin)
  • Ricerca distribuita
  • Alta disponibilità
  • funzioni extra come "intendevi?", ricerche correlate, ecc

Per lo scenario sopra, è possibile utilizzare SpellCheckComponent che è impacchettato con Solr . Ci sono molte altre funzionalità, The SnowballPorterFilterFactory aiuta a recuperare i record dicendo che 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 ci si trovi in ​​ambiente LINUX, è possibile procedere ulteriormente a 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 questa stabile.

Dopo aver scaricato l'archivio, estrarlo in una cartella a scelta. Dì ... Downloadso qualunque 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$

Avviare il Jetty Application Server

Jetty è disponibile nella cartella degli esempi della solr-4.8.1directory, quindi naviga all'interno e avvia Jetty Application Server.

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

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

(SUGGERIMENTO: utilizzare & after start.jar per far funzionare il Jetty Server in background)

Per verificare se Apache Solr funziona correttamente, visita questo URL sul browser. http: // localhost: 8983 / solr

Esecuzione di Jetty su porta personalizzata

Funziona sulla porta 8983 come impostazione predefinita. È possibile modificare la porta qui o direttamente all'interno del jetty.xmlfile.

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

Scarica JConnector

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

Dopo averlo scaricato, estrarre la cartella e copiarlo mysql-connector-java-5.1.31-bin.jare incollarlo nella directory lib .

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

Creazione della tabella MySQL da collegare ad Apache Solr

Per utilizzare Solr , è necessario disporre di alcune 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.Tabella struttura

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 core e aggiungere le direttive lib

1. Navigare a

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

2. Modifica di solrconfig.xml

Aggiungi queste due direttive a questo file.

  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

Ora aggiungi il DIH (Data Import Handler)

<requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

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

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

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>

(SUGGERIMENTO: è possibile avere un numero qualsiasi di entità ma fare attenzione al campo ID, se sono uguali, l'indicizzazione verrà ignorata.)

4.Modificare il file schema.xml

Aggiungi questo al tuo schema.xml come mostrato ..

<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

Implementazione

indicizzazione

Questo è dove sta il vero affare. È necessario eseguire l'indicizzazione dei dati da MySQL a Solr inorder per utilizzare le query Solr.

Passaggio 1: vai al pannello di amministrazione di Solr

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

Questo è il pannello di amministrazione principale di Apache Solr

Come indica il marcatore, vai a Registrazione in ordine per verificare se una delle configurazioni sopra ha portato a errori.

Passaggio 2: controlla i tuoi registri

Ok, ora sei qui, come puoi, ci sono molti messaggi gialli (AVVERTENZE). Assicurati di non avere messaggi di errore contrassegnati in rosso. In precedenza, sulla nostra configurazione avevamo aggiunto una query selezionata sul nostro db-data-config.xml , diciamo che se ci fossero errori su quella query, sarebbe stata mostrata qui.

Questa è la sezione di registrazione del tuo motore Apache Solr

Bene, nessun errore. Siamo a posto. Scegliamo collection1 dall'elenco come mostrato e selezioniamo Dataimport

Passaggio 3: DIH (gestore importazione dati)

Usando il DIH, ti collegherai a MySQL da Solr attraverso il file di configurazione db-data-config.xml dall'interfaccia Solr e recupererai i 10 record dal database che viene indicizzato su Solr .

Per fare ciò, scegli l'importazione completa e seleziona le opzioni Pulisci e Salva . Ora fai clic su Esegui come mostrato.

In alternativa, è possibile utilizzare anche una query di importazione completa diretta come questa.

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

Il gestore di importazione dati

Dopo aver fatto clic su Esegui , Solr inizia a indicizzare i record, in caso di errori, indica Indicizzazione non riuscita e si deve tornare alla sezione Registrazione per vedere cosa è andato storto.

Supponendo che non vi siano errori con questa configurazione e se l'indicizzazione è stata completata correttamente, si otterrebbe questa notifica.

Successo di indicizzazione

Passaggio 4: esecuzione di query Solr

Sembra che tutto sia andato bene, ora è possibile utilizzare le query Solr per eseguire una query sui dati indicizzati. Fare clic sulla query a sinistra e quindi premere il pulsante Esegui 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 solo bisogno di nomi che iniziano con Ja , in questo caso, devi scegliere come target il nome della colonna solr_name, quindi la tua query va così.

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

I dati JSON che iniziano con Ja *

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


3
@Downvoter, sentiti libero di commentare o modificare questa risposta e il ragionamento per il downvote aiuterà anche gli altri.
Shankar Damodaran,

4
questo è uno dei post più completi e ben organizzati che ho visto su SO. Lavoro fantastico.
degenerato

28

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

Ma non ha operatori di ricerca intuitivi come + o AND (usa & |!) E non sono entusiasta di come funziona sul loro sito di documentazione. Sebbene abbia grassetto dei termini di corrispondenza negli snippet dei risultati, l'algoritmo predefinito per il quale i termini di corrispondenza non è eccezionale. 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. È il valore predefinito per la ricerca di 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 fantastici . Sono codice solido e si sono evoluti con significativi miglioramenti nell'usabilità, quindi gli strumenti sono tutti lì per effettuare ricerche che soddisfano 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.


1
Credo che con la ricerca full-text di PostgreSQL ti riferisca Tsearch. Ma Tsearch non supporta la ricerca di frasi. È ancora nella loro lista TODO sai.msu.su/~megera/wiki/FTS_Todo .
Gnanam,

1
Ho appena fatto un sacco di test sulla ricerca a testo integrale di Postgres 9.0; è stato deluso dal constatare che il testo in francese non corrisponde se l'utente dimentica di ottenere tutti gli accenti giusti. La corrispondenza delle forme delle parole è irregolare - ad esempio, in inglese "dire" non corrisponde al testo contenente "detto". Complessivamente abbastanza impressionante per una funzionalità integrata nelle lingue testate (en, fr, ru).
Roman Starkov,

9
@romkyns: è necessario installare un dizionario non accento per rimuoverli.
Denis de Bernardy,

2
"OTOH, è molto meglio della ricerca di testo MySQL, che non indicizza nemmeno parole di tre lettere o meno." Questa non è una restrizione integrata di MySQL - è qualunque cosa tu abbia impostato nel file di configurazione. Se vuoi indicizzare parole di una lettera, modifica un valore nella configurazione.
Canuck,

1
È preoccupante che le persone facciano confronti su database che non hanno ancora esplorato completamente. MySQL PU index indicizzare le parole con tre caratteri o meno - devi solo configurarlo correttamente.
TheCarver

22

Solo i miei due centesimi per questa domanda molto antica. 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 privi di schemi. Elasticsearch è sviluppato in Java ed è rilasciato come open source secondo i termini della Licenza Apache.

I vantaggi rispetto ad altri motori FTS (ricerca full text) sono:

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

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


10

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

Cordiali saluti, La lunghezza minima delle parole full-text di MySQL è regolabile almeno da MySQL 5.0. Google 'mysql full-text min length' per semplici istruzioni.

Detto questo, il full-text di MySQL ha dei limiti: per prima cosa, l'aggiornamento si rallenta una volta raggiunto un milione di record, ...


2

Vorrei aggiungere mnoGoSearch all'elenco. Soluzione estremamente performante e flessibile, che funziona come Google: l'indicizzatore recupera i dati da più siti, è possibile utilizzare criteri di base o inventare i propri hook 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. Puoi compilarlo e installarlo o su server autonomo, o anche sul tuo server principale, non ha bisogno di risorse come Solr, poiché è scritto in C e funziona perfettamente anche su server di piccole dimensioni.

All'inizio devi compilarlo da solo, quindi richiede una certa conoscenza. Ho realizzato una piccola sceneggiatura per Debian, che potrebbe aiutare. Eventuali modifiche sono benvenute.

Dato che stai usando Django framework, potresti usare un client PHP nel mezzo o trovare una soluzione in Python, ho visto alcuni articoli .

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.