2015-01-16 10 views
13

Ich versuche, eine Suchmaschine für meine Rezepte-Website mit Mongo db zu implementieren. Ich versuche, den Benutzern die Suchvorschläge in der Widget-Box "Tipp" anzuzeigen.mongodb approximate string matching

Ich versuche sogar, falsch geschriebene Abfragen (Levenshtein-Abstand) zu unterstützen.

Zum Beispiel: wenn Benutzer 'Pza' eingeben, sollte Typ-Ahead 'Pizza' als einer der Vorschläge anzeigen.

Wie kann ich solche Funktionalität mit mongodb implementieren?

Bitte beachten Sie, dass die Suche sofort erfolgen sollte, da das Suchergebnis vom Typ-Ahead-Widget abgerufen wird. Die Sammlungen, über die ich Suchanfragen ausführen würde, haben höchstens 1 Million Einträge.

Ich dachte, Levenshtein Distanzalgorithmus zu implementieren, aber dies würde die Leistung verlangsamen, da die Sammlung riesig ist.

Ich lese FTS (Volltextsuche) in Mongo 2.6 ist jetzt ziemlich stabil, aber meine Anforderung ist Ungefähre Übereinstimmung, nicht FTS. FTS wird 'Pza' nicht für 'Pizza' zurückgeben.

Bitte empfehlen Sie mir den effizienten Weg.

Ich verwende node js mongodb nativen Treiber.

+0

Wenn Sie diese Art von Ergebnissen wirklich wollen, dann sind Sie wahrscheinlich am besten mit der Implementierung einer externen Suchmaschine Lösung, die es bereits OOTB macht. Die Textsuchfunktionen von MongoDB sind als "minimaler" Fall gedacht. Sie können Ihr Haupt-Repository immer in MongoDB behalten, und es gibt vorhandene Connector-Anweisungen für beliebte Produkte. –

Antwort

10

Die Funktion text search in MongoDB (wie 2.6) verfügt über keine integrierten Funktionen für die Fuzzy-/Teilzeichenfolgenübereinstimmung. Wie Sie bereits festgestellt haben, konzentriert sich der Anwendungsfall derzeit auf die Sprache & Stemming-Unterstützung mit grundlegenden booleschen Operatoren und Wort/Satz-Übereinstimmung.

Es gibt mehrere mögliche Ansätze für Fuzzy Matching zu berücksichtigen je nach Ihren Anforderungen und wie Sie wollen „effizient“ (Geschwindigkeit, Speicher, Entwickler Zeit, Infrastruktur erforderlich, etc.) qualifizieren:

  • Unterstützung Implement für Fuzzy/Partial Matching in Ihrer Anwendungslogik unter Verwendung einiger der leicht verfügbaren Soundalike- und Ähnlichkeitsalgorithmen. Zu den Vorteilen dieses Ansatzes gehört, dass Sie keine zusätzliche Infrastruktur hinzufügen müssen und die Anpassung an Ihre Anforderungen genau abstimmen können.

    Für einige detailliertere Beispiele siehe: Efficient Techniques for Fuzzy and Partial matching in MongoDB.

  • In ein externes Suchwerkzeug integrieren, das erweiterte Suchfunktionen bietet. Dies erhöht die Komplexität Ihrer Bereitstellung und ist wahrscheinlich nur für Typahead übertrieben, aber Sie können andere Suchfunktionen finden, die Sie an anderer Stelle in Ihre Anwendung integrieren möchten (z. B. "Gefällt mir", Wortnähe, Facettensuche usw.).

    Zum Beispiel siehe: How to Perform Fuzzy-Matching with Mongo Connector and Elastic Search. Hinweis: ElasticSearchs fuzzy query basiert auf der Levenshtein-Distanz.

  • Verwenden Sie eine Autocomplete-Bibliothek wie Twitter Open Source typeahead.js, die eine Suggestion-Engine und Abfrage/Caching-API enthält. Typahead ist eigentlich komplementär zu allen anderen Back-End-Ansätzen, und sein (optionaler) Vorschlags-Engine Bloodhound unterstützt Prefetching sowie das Zwischenspeichern von Daten im lokalen Speicher.