2009-02-02 13 views
22

Wir haben Tausende von Seiten von Zeitungsartikeln OCR. Die Zeitung, die Ausgabe, das Datum, die Seitenzahl und der OCR-Text jeder Seite wurden in eine mySQL-Datenbank geschrieben.Google-ähnliche Suchmaschine in PHP/mySQL

Wir wollen jetzt eine Google-ähnliche Suchmaschine in PHP erstellen, um die Seiten zu finden, die eine Anfrage erhalten haben. Es muss schnell sein und nicht länger als eine Sekunde dauern.

Wie sollen wir das machen?

+3

Was unterscheidet Google von reinen Text-Suchmaschinen ist, dass es die Beziehungen zwischen den Seiten untersucht. Wie würden Sie Ihre Seiten miteinander in Beziehung setzen? Links? Schlüsselwörter/Phrasen? Wenn Sie keine Beziehungen haben, wäre es besser, wenn Sie nach einer Textsuche suchen. –

+1

Unsere Datenbank mit 50.000 Artikeln benötigt ca. 20 Sekunden um eine reine Textsuche durchzuführen. Unsere OCRed-Zeitungsseiten sind ein viel größerer Datensatz. Wir brauchen schnellere Google-ähnliche Methoden der Indexierung und des Abrufens, um unsere Zeitungen in weniger als einer Sekunde zu durchsuchen. – lkessler

+0

Suchmaschinen verwenden keine SQL-Datenbanken, da sie die Suche langsam machen. Sie können Lucene verwenden oder Ihre eigene Suchmaschine programmieren. PHP ist keine geeignete Sprache für die Entwicklung einer Suchmaschine. – alienCoder

Antwort

14

Sie können auch SphinxSearch ausprobieren. Craigslist verwendet sphinx und kann sowohl mit mysql als auch mit postgresql verbunden werden.

+0

hi, ich habe viele Webseiten erstellt, ich möchte jedes Wort in meinen Seiten suchen .. also, Sie sind alle Antwort nützlich für mich? Danke – pcs

+0

Ich wusste nicht Craigslist verwendet Sphinx –

10

Es gibt einige interessante Suchmaschinen für Sie auf einen Blick zu nehmen. Ich weiß nicht, was du mit "Google like" meinst, also werde ich diesen Teil einfach ignorieren.

  • Werfen Sie einen Blick auf den Lucene Motor. Das Original ist eine hohe Leistung, aber in Java geschrieben. Es gibt eine port of Lucene to PHP (bereits an anderer Stelle erwähnt), aber es ist zu langsam.
  • Werfen Sie einen ernsten Blick auf die Xapian Project. Es ist schnell. Es ist in C++ geschrieben, so dass Sie es wahrscheinlich für Ihre Zielserver erstellen müssen, aber PHP-Bindungen haben.
2

Ihr Szenario schlägt vor, dass Sie Ihre eigenen rollen möchten; gute Ausgangspunkte für eine allgemeine Suchmaschine würden:

Wenn Sie eine off-shelf Lösung verwenden:

+0

Wow. Warum schreibst du dein eigenes? Ich verstehe wirklich nicht, was es mit der Situation des OPs auf sich hat, dass es sich lohnt, das, was in letzter Zeit zu einer Ware geworden ist, wieder einzuführen. –

+2

Das OP sagte: "Wir wollen jetzt bauen" – Artelius

1

Vielleicht möchten Sie überprüfen Sphider. Meiner Erfahrung nach ist es ziemlich schnell und macht die Indizierung automatisch. Es ist auch Open Source, so dass Sie den Code nehmen und für Ihre Bedürfnisse ändern können.

2

Warum versuchen Sie nicht so etwas wie Google Search Appliance oder Google Enterprise? Es wird Kosten verbunden haben, aber dann wird es Sie davon abhalten, das Rad neu zu erfinden und Ihnen "google like" Suche zu geben.

+0

Wir würden lieber bei PHP und mySQL bleiben, weil die Datenbank übergreifende Zwecke hat und in den Rest unserer Website integriert werden muss. – lkessler

10

Wenn die Volltextsuche von MySQL 20 Sekunden pro Abfrage dauert, haben Sie es entweder falsch konfiguriert oder auf leistungsschwache Hardware ausgeführt - einige große Websites verwenden erfolgreich einfache alte MyISAM-Suche.

Meine Stimme geht für Solr, jedoch. Es basiert auf Lucene, also erhalten Sie den ganzen Reichtum und die Leistung dieses Best-of-Breed-Produkts, aber mit einer REST-API, die es sehr leicht macht from PHP. Es gibt sogar eine dW article.

+1

Ich stimme zu. Gehen Sie mit SOLR den ganzen Weg. Integriertes PHP und SOLR viele Male und es ist die Zeit wert. –

+0

Yeah 20 Sekunden für MySQL Die Volltextsuche zeigt an, dass etwas kaputt ist. Es sollte etwa 0,01 bis 0,05 Sekunden SQL + Seite Renderzeit insgesamt für Volltext auf> 250.000 Zeilen sogar auf einem sehr niedrigen System (Single Core, 512 MB RAM) dauern - sogar mehrere LIKE-Anweisungen für jedes Keyword in einem DB mit etwa 250.000 sollten nicht länger als eine Sekunde dauern. Klingt höchstwahrscheinlich, dass entweder die Spalten nicht alle nur indiziert sind. Für <250,00-Zeilen sollte die Schleife über alle übereinstimmenden Ergebnisse in PHP, um sie intelligent zu sortieren, immer noch unter einer Sekunde liegen. –

+0

Hallo, ich habe viele Webseiten erstellt, ich möchte jedes Wort in meinen Seiten suchen .. also, Sie sind alle Antwort nützlich für mich? Vielen Dank – pcs

4

Sie könnten alle Dateien in Google Docs speichern und dann die Ergebnisse auf Ihrer eigenen Website scrapen.

Meine Sorge ist, dass OCR-Genauigkeit immer noch ein Problem ist, so dass eine Überlegung für eine Suchanforderung die Fähigkeit ist, "unscharfe" Suchen durchzuführen. Fuzzy-Bedeutung, wenn die OCR das Wort "Hat" fälschlicherweise für "Heiß" erkennt, ist die Suchmaschine intelligent genug, um ähnliche, aber nicht exakte Ergebnisse zu liefern. In Oracle gibt es eine Funktion namens UTL_MATCH, die die Ähnlichkeit zwischen zwei Strings vergleicht: http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/u_match.htm#ARPLS352

Eine Funktion wie diese wäre nützlich.

0

SQLite hat recht gut zur Volltextsuche Fähigkeit - durch einen Hash-Split (aufblicken SQLite FTS 3/4 seiner überraschend gut)

, wenn Sie einen PHP-DIY-Ansatz Indizierung aus vielen kleinen Dateien einfach wollen Die Begriffe, die indiziert werden, können sehr gut funktionieren, und die Suche kann sehr schnell sein, sogar in PHP, wenn Sie darauf achten, es zu entwerfen. (die Idee ist, eine Suche nach einem Begriff nur eine sehr kleine Datei mit Begriffen mit den Hash-und Record-IDs suchen müssen - Sie könnten Bitarray-Slices verwenden, um Datensatz-IDs darzustellen, wenn Sie HD-Speicherplatz speichern möchten) .. aber das Indizieren jedes Wortes für Volltext wäre langsam in PHP .. dieser Teil sollte wirklich in c

für "Fuzzy" Suchmöglichkeiten vielleicht mit Metaphon Hashes getan werden.

für vorgefertigte Volltext-Tools überprüfen diese: SQLite FTS 3/4 (! SQLite sehr gute Volltext-Suchfunktion hat), Sphinx, kinoSearch (kinoSearch ist ein bisschen wie Lucene, aber das Back-End c mit einem netten einfachen Perl Wrapper - es gibt auch cLucene, aber ich denke, das ist immer noch vor-Alpha)

Java Lucene (oder irgendetwas Java-based) benötigt wahrscheinlich eine Menge RAM zu beiseite gelegt werden, um eine JVM - so wahrscheinlich nicht so toll, wenn Sie auf ein Budget sind