Motore di ricerca simile a Google in PHP / MySQL

Abbiamo registrato migliaia di pagine di articoli di giornale. Il giornale, il numero, la data, il numero di pagina e il text OCR di each pagina sono stati inseriti in un database mySQL.

Ora vogliamo creare un motore di ricerca simile a Google in PHP per trovare le pagine fornite da una query. Deve essere veloce e non richiedere più di un secondo per qualsiasi ricerca.

Come dovremmo farlo?

Puoi anche provare SphinxSearch . Craigslist usa la sfinge e può connettersi sia a mysql che a postgresql.

Ci sono alcuni motori di ricerca interessanti per te da dare un'occhiata. Non so cosa intendi con "Google mi piace", quindi ignorerò questa parte.

  • Dai un'occhiata al motore Lucene . L'originale è ad alte performance ma scritto in Java. C'è un porto di Lucene in PHP (già menzionato altrove) ma è troppo lento.
  • Dai un'occhiata seria al Progetto Xapian . È veloce. È scritto in C ++, quindi probabilmente dovrai costruirlo per i tuoi server di destinazione ma ha associazioni PHP.

Se la ricerca full text di MySQL impiega 20 secondi per query, è configurata in modo errato o in esecuzione su hardware sottodimensionato: alcuni siti di grandi size stanno utilizzando con successo la semplice ricerca MyISAM.

Il mio voto vale per Solr , tuttavia. Si basa su Lucene, in modo da get tutta la ricchezza e le performance di quel prodotto migliore di razza, ma con un'API RESTful, che lo rende molto facilmente da PHP . C'è anche un articolo dW .

Puoi mettere tutti i file su Google Docs, quindi raschiare i risultati sul tuo sito web.

La mia preoccupazione è che l'accuratezza dell'OCR sia ancora un problema, quindi una considerazione per un requisito di ricerca è la possibilità di eseguire ricerche "sfocate". Significato sfocato quando l'OCR riconosce erroneamente la parola "cappello" per "caldo", il motore di ricerca sarà abbastanza intelligente da restituire risultati simili ma non esatti. In Oracle, esiste una function chiamata UTL_MATCH che confronta la somiglianza tra due stringhe: http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/u_match.htm#ARPLS352

Una function come questa sarebbe utile.

Il tuo scenario suggerisce che ti piacerebbe lanciare da solo; i buoni punti di partenza per un motore di ricerca generale includono:

  • Ingegneria del software per applicazioni Internet / Ricerca
  • L'anatomia di un motore di ricerca web ipertestuale su larga scala da parte di alcuni ragazzi
  • Se la struttura del tuo documento suggerisce funzionalità di interconnessione, puoi sfruttarla nel sistema di classificazione, vedi PageRank

Se si desidera utilizzare una soluzione off-shelf:

  • Se la tua applicazione è basata sul web e disponibile per la networking pubblica, devi davvero avere una buona ragione per non andare con Google Site Search
  • Lucene ha una port per PHP

Perché non provi qualcosa come Google Search Appliance o Google Enterprise? Avrà un costo associato ma poi ti risparmierà dal re-inventare la ruota e ti darà la ricerca "come su Google".

Controlla questa port Lucene per PHP:

  • Zend_Search_Lucene

Potresti voler controllare Sphider . Nella mia esperienza è abbastanza veloce e fa l'indexing automaticamente. È anche open source, quindi puoi prendere il codice e modificarlo per le tue esigenze.

sqlite ha una capacità di ricerca full text abbastanza buona (guarda sqlite FTS 3/4 – è sorprendentemente buona)

se si desidera un semplice approccio diy in PHP, l'indexing utilizzando un sacco di piccoli file divisi da un hash dei termini indicizzati può funzionare molto bene e la ricerca può essere molto veloce anche in php se si cura di progettarlo. (l'idea è di effettuare una ricerca su un termine solo per cercare un file molto piccolo che contenga termini corrispondenti all'hash e all'ID del record – potresti usare le slice di bitarrays per rappresentare gli ID dei record se vuoi salvare lo spazio HD) .. ma facendo il l'indexing di each parola per il text completo sarebbe lenta in php .. quella parte dovrebbe essere davvero fatta in c

per le ricerche "Fuzzy" è ansible utilizzare gli hash del metaphone.

per gli strumenti di fulltext pre-costruiti controlla questi: sqlite FTS 3/4 (sqlite ha ottime capacità di ricerca fulltext!), Sphinx, kinoSearch (kinoSearch è un po 'come Lucene ma il back-end è c con un bel wrapper perl facile – c'è anche cLucene ma penso che sia ancora pre-alpha)

Java Lucene (o qualsiasi cosa sia basata su Java) probabilmente ha bisogno di un sacco di ram per essere messo da parte per eseguire una JVM – quindi probabilmente non è così grande se hai un budget

Controlla questo motore di ricerca con php e MySQL ….. Funziona come il motore di ricerca di Google. Starkbook php-MySQL motore di ricerca