Sphinx: Open Source Search ServerMatteo Baccanmatteo@baccan.itJug Novara, PUG Novara
Sphinx: Open Source Search Server•   Relatore:           Matteo Baccan•   Area:               Open Source•   Target:      ...
Chi sono?  Divulgatore informatico, giornalista per riviste  tecniche nazionali oltre 700 articoli per :Dev, Login,  Compu...
Cosè Sphinx?•   Acronimo di SQL Phrase Index•   Un motore di ricerca “full text”•   Un “emulatore” MySQL•   Veloce, Compat...
Perché usare Sphinx?• Uso già MySQL/Lucene/Solr                              no• Uso Lucene in deep                       ...
Alcuni numeri?• 10-1000x volte più veloce di MySQL sulle ricerche  full-text   – MySQL è veloce solo con gli indici in RAM...
Risultati rilevanti• Sphinx ha diversi algoritmi per il calcolo del rank   – phrase proximity (aka LCS) : posizione delle ...
Alcuni algoritmi di rilevanza• SPH_RANK_PROXIMITY_BM25: combina LCS e BM25• SPH_RANK_BM25: solo BM25• SPH_RANK_NONE: nessu...
Ma chi lo usa?• boardreader.com, 1.000.000 query/day, 16.000.000.000  documenti, 5TB, 27 sphinx box• craigslist.org, 200.0...
Architettura base• sphinx.conf file di configurazione• Indexer      indicizzatore• SearchD      demone di ricerca• Search ...
Come indicizzo?• Definisco un datasource : connessione e  stringa di selezione dei dati• Definisco un indice: posizione ne...
Come indicizzo? Il datasourcesource job {  type             = mysql  sql_host         = localhost  sql_user         = sphi...
Come indicizzo? Lindiceindex job {   source         = job   path           = ./data/job   docinfo        = none   mlock   ...
Come indicizzo? Lindexerindexer.exe jobSphinx 2.0.4-id64-release (r3135)Copyright (c) 2001-2012, Andrew AksyonoffCopyright...
Come cerco?• Da riga comando con Search• Lanciando il demone SearchD e interrogandolo  con  – SphinxAPI (PHP, Java e altri...
SphinxAPI - JavaSphinxClient cl = new SphinxClient( "localhost", 3307 );SphinxResult res = cl.Query("j2ee php", "job");if ...
SphinxAPI - PHPrequire ( "sphinxapi.php" );$cl = new SphinxClient ();$cl->SetServer( "127.0.0.1", 3307 ); $cl->SetArrayRes...
SphinxQLSphinx è in grado di emulare il protocollo MySQLAl suo interno è presente un interprete SQL            MySQL non è...
SphinxQL - JDBCConnection conn =DriverManager.getConnection("jdbc:mysql://127.0.0.1:3308");Statement stmt = conn.createSta...
SphinxSE• Occorre ricompilare MySQL  – Oppure scaricarlo da http://www.coreseek.cn• Si verifica guardando gli  engine inst...
SphinxSECREATE TABLE jobsp (   id       BIGINT,   weight   INTEGER NOT NULL,   query    VARCHAR(3072) NOT NULL,   group_id...
SphinxSELa tabella si usa mettendola in Join con latabella contenente i dati, indicando come queryil dato da cercareSELECT...
Indici distribuiti• In caso di alto traffico, è possibile creare indici  dati dalla somma dei risultati di differenti  ist...
Indici distribuiti – nodo masterindex job {   type       = distributed    agent      = localhost:3310:job    agent      = ...
Indici distribuiti – interrogazione nodijava -jar sphinxapi.jar -p 3310 -i job j2ee php  j2ee found 1005 times in 632 docu...
Indici distribuiti – interrogazione masterjava -jar sphinxapi.jar -p 3312 -i job j2ee php  j2ee found 1938 times in 1230 d...
RT Index (RealTime)• Indici dinamici in grado di gestire  – INSERT  – UPDATE  – DELETE  – SELECT• Più dinamici, ma tendono...
RT Indexindex rt {   type           = rt   path           = data/rt   rt_field       = descrizione # full text   rt_attr_u...
RT IndexNon è MySQL è SphinxClass.forName("org.gjt.mm.mysql.Driver");Connection conn =DriverManager.getConnection("jdbc:my...
RT Indexmysql -h 127.0.0.1 -P 3320Welcome to the MySQL monitor. Commands end with ; or g.Your MySQL connection id is 1Serv...
RT Indexmysql> select * from rt;+------+--------+------+| id   | weight | gid |+------+--------+------+|    1 |      1 | 1...
Di cosa non abbiamo parlato•   XMLPipe datasource•   Main e Delta index•   Index merge•   Stopwords•   Wordforms•   Sortin...
Matteo Baccan   33matteo@baccan.it – Jug Novara, PUG Novara
Qualche link• http://www.sphinxsearch.com/       Sphinx (source, info)• http://www.coreseek.cn/news/14/99/ SphinxSE (binar...
Matteo Baccanmatteo@baccan.it                             Matteo Baccan   35 matteo@baccan.it – Jug Novara, PUG Novara
Upcoming SlideShare
Loading in...5
×

Codemotion 2012 : Sphinx: Open Source Search Server

2,347

Published on

Codemotion 2012 : Sphinx: Open Source Search Server

Sporchiamoci le mani con un'alternativa a Lucene e MySQL. Un prodotto OpenSource, portabile, veloce, attento alle prestazioni e ai consumi di spazio e memoria. Vedremo come distribuire il carico, come effettuare hotswap di indici, come usare lo stesso JDBC per accedere a MySQL e Sphinx, come gestire indici dinamici e statici. Utilizzeremo query, subquery, strategia di ricerca diverse. Studieremo le migliori tecniche per indicizzare milioni di documenti, il tutto tramite PHP e JAVA su casi reali

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,347
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
13
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Codemotion 2012 : Sphinx: Open Source Search Server

  1. 1. Sphinx: Open Source Search ServerMatteo Baccanmatteo@baccan.itJug Novara, PUG Novara
  2. 2. Sphinx: Open Source Search Server• Relatore: Matteo Baccan• Area: Open Source• Target: Expert, Developer, Power User• Difficoltà: Media-Bassa Sporchiamoci le mani con unalternativa a Lucene e MySQL. Un prodotto OpenSource, portabile, veloce, attento alle prestazioni e ai consumi di spazio e memoria. Vedremo come distribuire il carico, come effettuare hotswap di indici, come usare lo stesso JDBC per accedere a MySQL e Sphinx, come gestire indici dinamici e statici. Utilizzeremo query, subquery, strategia di ricerca diverse. Studieremo le migliori tecniche per indicizzare milioni di documenti, il tutto tramite PHP e JAVA su casi realiDa 0 a 100 in 40 minuti, allacciate le cinture ;) Matteo Baccan 2 matteo@baccan.it – Jug Novara, PUG Novara
  3. 3. Chi sono? Divulgatore informatico, giornalista per riviste tecniche nazionali oltre 700 articoli per :Dev, Login, Computer Programming, Mokabyte. Relatore tecnico ad eventi di programmazione: Borland Forum 2000, Webbit 2004, JIP day 2005, Javaday (2006,2007,2010) PHPDay (2008, 2010), CONFSL 2010, WebTech 2010, Codemotin (2011,2012). Autore di Corso di C# ISBN 8881500167. Autore di JobCrawler e HTML2POP3 (Oltre 900.000 download su SourceForge) Matteo Baccan 3 matteo@baccan.it – Jug Novara, PUG Novara
  4. 4. Cosè Sphinx?• Acronimo di SQL Phrase Index• Un motore di ricerca “full text”• Un “emulatore” MySQL• Veloce, Compatto, Scalabile Matteo Baccan 4 matteo@baccan.it – Jug Novara, PUG Novara
  5. 5. Perché usare Sphinx?• Uso già MySQL/Lucene/Solr no• Uso Lucene in deep no• Uso Lucene, ma è lento a indicizzare forse• Ho molto spazio allocato dagli indici forse• Con java non conosco alternative forse• Devo convertire molto codice SQL si• Non ho un motore di ricerca si• Ho bisogno di una soluzione veloce si Matteo Baccan 5 matteo@baccan.it – Jug Novara, PUG Novara
  6. 6. Alcuni numeri?• 10-1000x volte più veloce di MySQL sulle ricerche full-text – MySQL è veloce solo con gli indici in RAM)• 2-3x volte più veloce sulle ricerche non full-text – Sphinx ha meno feature da supportare ;)• 2-4x volte più veloce di Lucene sulle ricerche full-text [fonte Sphinx Technologies Inc.] ;) Matteo Baccan 6 matteo@baccan.it – Jug Novara, PUG Novara
  7. 7. Risultati rilevanti• Sphinx ha diversi algoritmi per il calcolo del rank – phrase proximity (aka LCS) : posizione delle parole – BM25 : frequenza delle parole La combinazione di questi algoritmi può variare la qualità dei dati cercati Matteo Baccan 7 matteo@baccan.it – Jug Novara, PUG Novara
  8. 8. Alcuni algoritmi di rilevanza• SPH_RANK_PROXIMITY_BM25: combina LCS e BM25• SPH_RANK_BM25: solo BM25• SPH_RANK_NONE: nessun rank• SPH_RANK_WORDCOUNT: solo per numero di parole, in base alla priorità dei campi• SPH_RANK_SPH04: LCS e BM25, ma portando in testa gli exact match• SPH_RANK_EXPR: basato su espressione Matteo Baccan 8 matteo@baccan.it – Jug Novara, PUG Novara
  9. 9. Ma chi lo usa?• boardreader.com, 1.000.000 query/day, 16.000.000.000 documenti, 5TB, 27 sphinx box• craigslist.org, 200.000.000 query/day (2.000 al secondo) 15 sphinx box http://sphinxsearch.com/info/powered/• moonlab.it network: 500.000 query/day, 10.000.000 documenti, 300 millesimi tempo medio di risposta 2 sphinx box bilanciate da macchine dual core con 4g di RAM (con jboss, mysql, sphinx e altri processi in concorrenza) Matteo Baccan 9 matteo@baccan.it – Jug Novara, PUG Novara
  10. 10. Architettura base• sphinx.conf file di configurazione• Indexer indicizzatore• SearchD demone di ricerca• Search ricerca command line Matteo Baccan 10 matteo@baccan.it – Jug Novara, PUG Novara
  11. 11. Come indicizzo?• Definisco un datasource : connessione e stringa di selezione dei dati• Definisco un indice: posizione nel file system e tipologia• Indicizzo: dico allindexer di creare lindice appena definito Matteo Baccan 11 matteo@baccan.it – Jug Novara, PUG Novara
  12. 12. Come indicizzo? Il datasourcesource job { type = mysql sql_host = localhost sql_user = sphinx sql_pass = sql_db = jobcrawler sql_port = 3306 sql_query = SELECT id, descrizione FROM `job` sql_query_info = SELECT id, titolo FROM job WHERE id=$id} Matteo Baccan 12 matteo@baccan.it – Jug Novara, PUG Novara
  13. 13. Come indicizzo? Lindiceindex job { source = job path = ./data/job docinfo = none mlock =0 morphology = none min_word_len =1 charset_type = sbcs html_strip =0} Matteo Baccan 13 matteo@baccan.it – Jug Novara, PUG Novara
  14. 14. Come indicizzo? Lindexerindexer.exe jobSphinx 2.0.4-id64-release (r3135)Copyright (c) 2001-2012, Andrew AksyonoffCopyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)using config file ./sphinx.conf...indexing index job...collected 125565 docs, 61.9 MBsorted 8.9 Mhits, 100.0% donetotal 125565 docs, 61894430 bytestotal 7.319 sec, 8456618 bytes/sec, 17155.91 docs/sectotal 2 reads, 0.155 sec, 12707.9 kb/call avg, 77.6 msec/call avgtotal 67 writes, 0.258 sec, 890.2 kb/call avg, 3.8 msec/call avg Matteo Baccan 14 matteo@baccan.it – Jug Novara, PUG Novara
  15. 15. Come cerco?• Da riga comando con Search• Lanciando il demone SearchD e interrogandolo con – SphinxAPI (PHP, Java e altri) – SphinxQL : tramite SQL – SphinxSE : MySQL storage engine Matteo Baccan 15 matteo@baccan.it – Jug Novara, PUG Novara
  16. 16. SphinxAPI - JavaSphinxClient cl = new SphinxClient( "localhost", 3307 );SphinxResult res = cl.Query("j2ee php", "job");if ( res!=null ) { for ( int i=0; i<res.matches.length; i++ ) { SphinxMatch info = res.matches[i]; System.out.println( (i+1) + ". id=" + info.docId ); }} Matteo Baccan 16 matteo@baccan.it – Jug Novara, PUG Novara
  17. 17. SphinxAPI - PHPrequire ( "sphinxapi.php" );$cl = new SphinxClient ();$cl->SetServer( "127.0.0.1", 3307 ); $cl->SetArrayResult ( true );$res = $cl->Query( "j2ee php", "job" );if ( $res ) { $n = 0; foreach ( $res["matches"] as $docinfo ) { $n++; print "$n. doc_id=$docinfo[id]<br/>"; }} Matteo Baccan 17 matteo@baccan.it – Jug Novara, PUG Novara
  18. 18. SphinxQLSphinx è in grado di emulare il protocollo MySQLAl suo interno è presente un interprete SQL MySQL non è più necessarioMolti client sono in grado di usare Sphinx come sefosse un server MySQL Matteo Baccan 18 matteo@baccan.it – Jug Novara, PUG Novara
  19. 19. SphinxQL - JDBCConnection conn =DriverManager.getConnection("jdbc:mysql://127.0.0.1:3308");Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("select * from jobwhere match(j2ee php)");while( rs.next() ) System.out.println( rs.getString(1) ); Matteo Baccan 19 matteo@baccan.it – Jug Novara, PUG Novara
  20. 20. SphinxSE• Occorre ricompilare MySQL – Oppure scaricarlo da http://www.coreseek.cn• Si verifica guardando gli engine installati SHOW ENGINES Matteo Baccan 20 matteo@baccan.it – Jug Novara, PUG Novara
  21. 21. SphinxSECREATE TABLE jobsp ( id BIGINT, weight INTEGER NOT NULL, query VARCHAR(3072) NOT NULL, group_id INTEGER, INDEX(query)) ENGINE=SPHINXCONNECTION="sphinx://localhost:3307/job"; Matteo Baccan 21 matteo@baccan.it – Jug Novara, PUG Novara
  22. 22. SphinxSELa tabella si usa mettendola in Join con latabella contenente i dati, indicando come queryil dato da cercareSELECT job.id, titolo FROM jobJOIN jobsp ON (job.id=jobsp.id)WHERE QUERY=j2ee php;mode=any; Matteo Baccan 22 matteo@baccan.it – Jug Novara, PUG Novara
  23. 23. Indici distribuiti• In caso di alto traffico, è possibile creare indici dati dalla somma dei risultati di differenti istanze di Sphinx e indici locali• Quello che varia, rispetto allindice standard, è la dichiarazione di agent di ricerca, al posto/in concomitanza di indici fisici Matteo Baccan 23 matteo@baccan.it – Jug Novara, PUG Novara
  24. 24. Indici distribuiti – nodo masterindex job { type = distributed agent = localhost:3310:job agent = localhost:3311:job agent_connect_timeout = 1000 agent_query_timeout = 3000} Matteo Baccan 24 matteo@baccan.it – Jug Novara, PUG Novara
  25. 25. Indici distribuiti – interrogazione nodijava -jar sphinxapi.jar -p 3310 -i job j2ee php j2ee found 1005 times in 632 documents php found 337 times in 255 documentsjava -jar sphinxapi.jar -p 3311 -i job j2ee php j2ee found 933 times in 598 documents php found 371 times in 268 documents Matteo Baccan 25 matteo@baccan.it – Jug Novara, PUG Novara
  26. 26. Indici distribuiti – interrogazione masterjava -jar sphinxapi.jar -p 3312 -i job j2ee php j2ee found 1938 times in 1230 documents php found 708 times in 523 documents Matteo Baccan 26 matteo@baccan.it – Jug Novara, PUG Novara
  27. 27. RT Index (RealTime)• Indici dinamici in grado di gestire – INSERT – UPDATE – DELETE – SELECT• Più dinamici, ma tendono a degradare le performance per frammentazione e su grandi quantità di dati Matteo Baccan 27 matteo@baccan.it – Jug Novara, PUG Novara
  28. 28. RT Indexindex rt { type = rt path = data/rt rt_field = descrizione # full text rt_attr_uint = gid} Matteo Baccan 28 matteo@baccan.it – Jug Novara, PUG Novara
  29. 29. RT IndexNon è MySQL è SphinxClass.forName("org.gjt.mm.mysql.Driver");Connection conn =DriverManager.getConnection("jdbc:mysql://127.0.0.1:3320");Statement stmt = conn.createStatement(); stmt.execute("delete from rt where id in(1,2,3)"); stmt.execute("insert into rt values(1,primo record ,100)"); stmt.execute("insert into rt values(2,secondo record,111)"); stmt.execute("insert into rt values(3,terzo record ,122)"); Matteo Baccan 29 matteo@baccan.it – Jug Novara, PUG Novara
  30. 30. RT Indexmysql -h 127.0.0.1 -P 3320Welcome to the MySQL monitor. Commands end with ; or g.Your MySQL connection id is 1Server version: 2.0.4-id64-release (r3135)Type help; or h for help. Type c to clear the buffer.mysql> Matteo Baccan 30 matteo@baccan.it – Jug Novara, PUG Novara
  31. 31. RT Indexmysql> select * from rt;+------+--------+------+| id | weight | gid |+------+--------+------+| 1 | 1 | 100 || 2 | 1 | 111 || 3 | 1 | 122 |+------+--------+------+3 rows in set (0.00 sec)mysql> select * from rt where match(secondo);+------+--------+------+| id | weight | gid |+------+--------+------+| 2 | 1680 | 111 |+------+--------+------+1 row in set (0.00 sec) Matteo Baccan 31 matteo@baccan.it – Jug Novara, PUG Novara
  32. 32. Di cosa non abbiamo parlato• XMLPipe datasource• Main e Delta index• Index merge• Stopwords• Wordforms• Sorting Mode• Group by• …. e molte altre cose ... Matteo Baccan 32 matteo@baccan.it – Jug Novara, PUG Novara
  33. 33. Matteo Baccan 33matteo@baccan.it – Jug Novara, PUG Novara
  34. 34. Qualche link• http://www.sphinxsearch.com/ Sphinx (source, info)• http://www.coreseek.cn/news/14/99/ SphinxSE (binari)• http://www.moonlab.it Cosa facciamo• http://www.baccan.it Cosa faccio Matteo Baccan 34 matteo@baccan.it – Jug Novara, PUG Novara
  35. 35. Matteo Baccanmatteo@baccan.it Matteo Baccan 35 matteo@baccan.it – Jug Novara, PUG Novara
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×