Volltextsuche wie Google

stimmen
11

Ich möchte Volltext-Suche in meiner off-line (android) Anwendung implementieren, um die Benutzer generierte Liste von Notizen zu suchen.

Ich mag es so wie Google verhalten (da die meisten Menschen bereits verwendet werden, um Google zu Abfrage)

Meine anfänglichen Anforderungen sind:

  • Schnell: wie Google oder so schnell wie möglich, mit 100.000 Dokumente mit 200 hundert Wörtern pro Person.
  • Die Suche nach zwei Worten sollte nur Dokumente zurück, die beiden Worte enthalten (nicht nur ein Wort) (es sei denn, der OR-Operator verwendet wird)
  • Groß- und Kleinschreibung (aka: Normalisierung): Wenn ich das Wort ‚Hallo‘ und ich suche nach ‚Hallo‘ soll es passen.
  • Diakritische Zeichen unempfindlich: Wenn ich das Wort ‚así‘ eine Suche nach ‚asi‘ entsprechen soll. In Spanisch, falsch viele Menschen entweder nicht setzen diakritische Zeichen oder nicht in ihnen richtig setzen.
  • Stoppwort Beseitigung: Um nicht ein riesiger Index sinnlose Worte wie ‚und‘, ‚die‘ oder ‚für‘ sollte überhaupt nicht indiziert werden.
  • Wörterbuch Substitution (aka: Worte stammen): ähnliche Worte sollten als eine indiziert werden. Zum Beispiel Instanzen von ‚hungrig‘ und ‚hungrig‘ sollte mit ‚Hunger‘ ersetzt.
  • Phrasensuche: ‚Hallo Welt!‘ Wenn ich den Text eine Suche nach ‚‚Welt Hallo‘‘ sollte es nicht passen, aber eine Suche nach ‚‚Hallo Welt‘‘ sollten übereinstimmen.
  • Suche nach allen Feldern (in Mehrfelder Dokumente), wenn kein Feld angegeben (nicht nur ein Standardfeld)
  • Auto-Vervollständigung in den Suchergebnissen während der Eingabe populäre Suchbegriffe zu geben. (Wie Google Suggest)

Wie kann ich eine Volltextsuchmaschine konfigurieren, so viel wie möglich, wie Google zu verhalten?

(Ich bin vor allem daran interessiert in Open Source, Java und insbesondere Lucene)

Veröffentlicht am 30/12/2009 um 01:35
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
2

Kaufen Sie eine Google Search Appliance . Oder, wie die Kommentare sagen, verwenden Lucene wie Sie bereits erwähnt.

Beantwortet am 30/12/2009 um 01:43
quelle vom benutzer

stimmen
3

Viele dieser Verhaltensweisen sind standardmäßig für Lucene. Die erste (einschließlich aller Bedingungen) nicht, aber dieses Verhalten, indem der Standardoperator erzwingen:

MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new StandardAnalyzer());
parser.setDefaultOperator(QueryParser.AND_OPERATOR);

Ich weiß, dass Artikel 2, 4 und 6 sind möglich, und IIRC, sie passieren standardmäßig. Ich bin nicht sicher über die Punkte 3 und 5, aber Lucene bietet eine Tonne Anpassungsmöglichkeiten, so würde ich vorschlagen, eine Proof-of-Concept mit Ihren Daten Umsetzung zu sehen, ob sie diese Anforderungen auch erfüllt.

Beantwortet am 30/12/2009 um 01:47
quelle vom benutzer

stimmen
0

Es sei denn, Sie eine Suchmaschine kaufen, haben Sie Lucene, Nutch, Apache Solr und einige andere.

Beantwortet am 30/12/2009 um 02:16
quelle vom benutzer

stimmen
0

HyperSQL ist eine reine Java-SQL-Implementierung, die ganz leicht ran werden kann, wie kann SQLite. Sie könnten ihre Volltext-Funktionen verwenden und Abfragen, das Rad neu zu erstellen, aber wie die anderen Kommentatoren haben darauf hingewiesen eine bestehende Implementierung ist wahrscheinlich am besten.

Beantwortet am 30/12/2009 um 08:14
quelle vom benutzer

stimmen
14

Ich denke , Lucene Ihre Anforderungen adressieren können. Sie sollten auch mit berücksichtigen Solr , die eine ähnliche Funktionalität und ist viel einfacher einzurichten.

Ich werde jede Anforderung einzeln besprechen, Lucene. Ich glaube, Solr ähnliche Mechanismen hat.

  • Schnell: wie Google oder so schnell wie möglich, mit 100.000 Dokumente mit 200 hundert Wörtern pro Person.

Dies ist eine vernünftige Größe Index sowohl für Lucene und Solr, ermöglicht Abruf bei einigen zehn Millisekunden pro Abfrage.

  • Die Suche nach zwei Worten sollte nur Dokumente zurück, die beiden Worte enthalten (nicht nur ein Wort) (es sei denn, der OR-Operator verwendet wird)

Sie können tun , dass eine Verwendung von BooleanQuery mit MUST als Standard in Lucene.

Die nächsten vier Anforderungen können durch die Anpassung eines Lucene behandelt werden Analyzer :

  • Groß- und Kleinschreibung (aka: Normalisierung): Wenn ich das Wort ‚Hallo‘ und ich suche nach ‚Hallo‘ soll es passen.

Ein LowerCaseFilter kann hierfür verwendet werden.

  • Diakritische Zeichen unempfindlich: Wenn ich das Wort ‚así‘ eine Suche nach ‚asi‘ entsprechen soll. In Spanisch, falsch viele Menschen entweder nicht setzen diakritische Zeichen oder nicht in ihnen richtig setzen.

Dies erfordert Unicode-Normalisierung durch diakritische Entfernung gefolgt. Sie können einen benutzerdefinierten Analyzer für diese bauen.

  • Stoppwort Beseitigung: Um nicht ein riesiger Index sinnlose Worte wie ‚und‘, ‚die‘ oder ‚für‘ sollte überhaupt nicht indiziert werden.

Ein StopFilter entfernt Stoppwörter in Lucene.

  • Wörterbuch Substitution (aka: Worte stammen): ähnliche Worte sollten als eine indiziert werden. Zum Beispiel Instanzen von ‚hungrig‘ und ‚hungrig‘ sollte mit ‚Hunger‘ ersetzt.

Lucene hat viele Schneeball - Stammerkennung . Einer von ihnen kann angebracht sein.

  • Phrasensuche: ‚Hallo Welt!‘ Wenn ich den Text eine Suche nach ‚‚Welt Hallo‘‘ sollte es nicht passen, aber eine Suche nach ‚‚Hallo Welt‘‘ sollten übereinstimmen.

Dies wird durch die Lucene abgedeckt PhraseQuery spezialisiert Abfrage.

Wie Sie sehen können, deckt Lucene alle erforderlichen Funktionalität. Um ein Gesamtbild zu erhalten, schlage ich das Buch Lucene in Aktion , die Apache Lucene Wiki oder The Lucid Imagination Website .

Beantwortet am 03/01/2010 um 22:48
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more