Nous avons compilé des milliers de pages d'articles de journaux. Le journal, le numéro, la date, le numéro de page et le texte OCRed de chaque page ont été placés dans une base de données mySQL.
Nous souhaitons maintenant créer un moteur de recherche semblable à celui de Google dans PHP pour trouver les pages auxquelles une requête a été adressée. Cela doit être rapide et ne prend pas plus d'une seconde pour une recherche.
Comment devrions-nous le faire?
Vous pouvez également essayer SphinxSearch . Craigslist utilise sphinx et peut se connecter à la fois à MySQL et à PostGresql.
Si la recherche en texte intégral de MySQL prend 20 secondes par requête, vous l’avez soit mal configurée, soit exécutée sur du matériel sous-alimenté - certains big sites utilisent avec succès la vieille recherche MyISAM.
Mon vote va pour Solr , cependant. Il est basé sur Lucene, vous obtenez ainsi toute la richesse et les performances de ce produit haut de gamme, mais avec une API RESTful, ce qui le rend très facilement de PHP . Il y a même un article dW .
Il existe des moteurs de recherche intéressants que vous pouvez consulter. Je ne sais pas ce que vous entendez par "Google like", alors je vais simplement ignorer cette partie.
Vous pouvez placer tous les fichiers dans Google Documents, puis transférer les résultats sur votre propre site Web.
Ce qui me préoccupe, c’est que la précision de la reconnaissance optique des caractères est toujours un problème. Par conséquent, la capacité à effectuer des recherches "floues" est un critère à prendre en compte pour une exigence de recherche. Signification floue lorsque l'OCR reconnaît de manière incorrecte le mot "hat" pour "hot", le moteur de recherche sera suffisamment intelligent pour renvoyer des résultats similaires mais non exacts. Dans Oracle, une fonction appelée UTL_MATCH compare la similarité entre deux chaînes: http://docs.Oracle.com/cd/E11882_01/appdev.112/e25788/u_match.htm#ARPLS352
Une fonction comme celle-ci serait utile.
Pourquoi n'essayez-vous pas quelque chose comme Google Search Appliance ou Google Enterprise? Cela aura un coût associé, mais cela vous évitera de réinventer la roue et vous donnera une recherche de type "google like".
Votre scénario suggère, que vous voudriez rouler le vôtre; Un bon point de départ pour un moteur de recherche général comprendrait:
Si vous souhaitez utiliser une solution sur étagère:
Vérifiez ceci Lucene port pour PHP:
Vous voudrez peut-être vérifier Sphider . D'après mon expérience, il est assez rapide et l'indexation automatique. Il est également open source afin que vous puissiez prendre le code et le modifier selon vos besoins.
sqlite a une assez bonne capacité de recherche en texte intégral (recherchez sqlite FTS 3/4 - son étonnamment bon)
si vous voulez une simple PHP approche de bricolage, l'indexation utilisant beaucoup de petits fichiers divisés par un hachage des termes indexés peut très bien fonctionner. La recherche AMD peut être très rapide même en php si vous prenez soin de la concevoir . (L'idée est de faire une recherche sur un terme. Il suffit de chercher dans un très petit fichier contenant les termes correspondant au hachage et aux identifiants d'enregistrement. Vous pouvez utiliser des tranches bitarray pour représenter les identifiants d'enregistrement si vous souhaitez économiser de l'espace HD. ) .. mais l'indexation de chaque mot pour le texte intégral serait lente en php .. cette partie devrait vraiment être faite en c
pour les recherches "Fuzzy", utilisez peut-être un hachage métaphone.
pour les outils en texte intégral prédéfinis, vérifiez les éléments suivants: sqlite FTS 3/4 (sqlite offre une très bonne capacité de recherche en texte intégral!), Sphinx, kinoSearch ( kinoSearch est un peu comme Lucene mais le back-end est c avec un joli wrapper Perl facile - il y a aussi cLucene mais je pense que c'est toujours pré-alpha)
Java Lucene (ou tout ce qui est basé sur Java) a probablement besoin de beaucoup de mémoire vive pour être mis de côté pour exécuter une machine virtuelle Java - donc probablement pas si génial si votre budget