Suche Namen mit Apache Solr
Ich habe nur gewagt, in den scheinbar einfachen, aber extrem komplexen Welt zu suchen. Für eine Anwendung, die ich bin erforderlich, um das erstellen einer such-Mechanismus für die Suche der Benutzer nach dem Namen.
Nach dem Lesen zahlreicher Beiträge und Artikel, darunter:
Wie kann ich mit Lucene für den persönlichen Namen (Vornamen, Nachnamen) suchen?
http://dublincore.org/documents/1998/02/03/name-representation/
was ist der beste Weg, um zu suchen, ein Soziales Netzwerk durch die Priorisierung eine Benutzer-Beziehungen zuerst?
http://www.gossamer-threads.com/lists/lucene/java-user/120417
Lucene Index-und Query-Design Frage - Suche Leute
Lucene Fuzzy-Suche für die Kunden mit Namen und teilweise Adresse
... und ein paar andere, die ich nicht finden kann in dem moment. Und immer mindestens die Indexierung und die einfache Suche in meiner Maschine, die ich haben dazu das folgende Schema für die Benutzer-Suche:
1) mit einem ersten, zweiten und Dritten Feld name und index diejenigen mit Solr
2) Verwenden Sie edismax als requestParser für multi-Spalte suchen
3) Verwenden Sie eine Kombination aus Normalisierung Filter wie: transliteration, Latein-zu-ascii-convesrion, etc.
4) Schließlich verwenden Sie fuzzy-Suche
Offenbar sehr neu in diesem bin ich nicht sicher, ob das obige ist der beste Weg, es zu tun und würde gerne hören von erfahrenen Benutzern, die haben eine bessere Idee, als mich in diesem Bereich.
Muss ich in der Lage, mit Namen in der folgenden Weise:
1) Accent folding: Jörn entspricht Jörn und Umgekehrt
2) Alternative Schreibweisen: Karl-matches Carl und Umgekehrt
3) Verkürzte Darstellungen (ich glaube, ich mache das mit dem SynonymFilterFactory): Sue Spiele Susanne, etc.
4) Levenstein matching: Jonn entspricht, John, etc.
5) Soundex-übereinstimmung: Elin und Ellen
Jede Anleitung, Kritik oder Kommentare sind sehr willkommen. Bitte lassen Sie mich wissen, wenn das möglich ist ... oder vielleicht bin ich einfach nur Tagträumen. 🙂
BEARBEITEN
Ich muss auch hinzufügen, dass ich auch ein fullname-Feld, falls einige Leute lange Namen haben, wie ein Beispiel aus einem der Beiträge: Jon Paul oder Del Carmen sollte auch passen, Jon Paul Del Carmen
Und da dies ein neues Projekt, ich kann ändern Sie das schema und Architektur eine Möglichkeit, dass ich sehen, passen, so gibt es sehr begrenzte Einschränkungen.
- Sie erzielen die besten Ergebnisse, indem Sie versuchen, Sie zu lösen 1 Problem zu einem Zeitpunkt. (Sie kennen das wahrscheinlich, ich bin nur daran erinnert 😉 )... UND ich würde versuchen, lösen die einfachsten Fragen zuerst. Ihre Liste sieht sortiert in umgekehrter Reihenfolge der Schwierigkeit. Ich würde beginnen mit #5 und meinen Weg zurück zur #1. Jede dieser Fragen rate eine separate Frage, die hier auf S. O. Schließlich, ich glaube, du wirst bessere Hilfe zu bekommen auf die user-Foren zu den einzelnen Projekten Haupt-Website. Ich bin mehrere Stunden verbrachten ein paar Monaten Lesen der lucene-forum an apache.org und fand es sehr ermutigend und enlighting. Viel Glück!
- Re accent folding, soweit ich weiß, ich weiß wirklich nicht, Schwedisch zum Beispiel, wenn Sie aber eine bestimmte Sprache analyzer auf den text, so lange wie die gleiche analyzer verwendet wird, auf der Abfrage, dann werden die indizierten Dokument durchsuchbar. Ich weiß wirklich nicht viel, obwohl über die Erkennung der Sprache auf ein Stück text.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es klingt wie Sie ein catering für einen Korpus mit Recherchen, die Sie anpassen müssen, sehr Locker?
Wenn Sie das tun, werden Sie wollen, wählen Sie die Felder, und legen Sie verschiedene boosts auf das Ranking Ihrer Ergebnisse.
Also separate "kopiert" - Felder in solr:
Siehe Auch: mehr nicht-Englisch Soundex-Diskussion
Synonyme für den Namen, ich weiß nicht, ob es ein public synonym-db zur Verfügung.
Fuzzy-Suche, ich habe nicht gefunden es nützlich, es verwendet die Levenshtein-Distanz.
Anderen filtern und indizieren Holen Sie sich mehr überlegen, "Suche nach relevanten" Ergebnisse.
Unicode-Zeichen im Namen können behandelt werden, mit der ASCIIFoldingFilterFactory
Das Sie beschreiben, Lösungen nach vorne für die erwartete Anwendungsfälle.
Wenn Sie möchten, dass die Qualität der Ergebnisse, plan-tuning Ihr Such-Relevanz
Diese Stimmung wird besonders wertvoll, wenn Sie versuchen zu entsprechen, auf die Synonyme, wie McDonald und McDonald (die einen größeren Levenshtein-Distanz als Carl und Karl).
Gefunden, ein Spitzname, db, nicht sicher, wie gut:
http://www.peacockdata2.com/products/pdnickname/
Beachten Sie, dass es ist nicht frei.
Die Antwort in einem anderen Beitrag ist ziemlich gut:
Ausbildung solr zu erkennen, Spitznamen oder Namen Varianten
Für phonetische Namen zu suchen, können Sie auch versuchen, die Beider-Morse-Filter, das funktioniert ziemlich gut, wenn man eine Mischung von Namen aus verschiedenen Ländern.
Wenn Sie es verwenden möchten, mit typeahead-Funktion, kombinieren Sie es mit einem EdgeNGramFilter:
Haben wir eine einfache Feld "name" - Typ, der erlaubt mischen beide 'Schlüssel' (z.B. SOUNDEX) und 'pairwise' Teile der oben genannten Antworten.
Hier die übersicht:
Hier ist der Kern seiner Umsetzung...
Herz ist deriveFieldsForName(name), in dem Sie Ihre "Schlüssel" aus PhoneticFilters, LowerCaseFolding, etc.
Hier ist der Kern seiner Umsetzung...
Herzen dies ist der buildQuery(name) - Methode, die zu erzeugen Sie eine Abfrage, die bewusst deriveFieldsForName(name) vor, so dass für eine gegebene Abfrage von name it finden Sie gute Kandidaten-Namen.
Hier ist was, das sieht aus wie in deiner Abfrage...
Den Inhalt myMatch hätte eine paarweise Levenstein oder die Jaro-Winkler-Implementierung.
N. B. Unsere eigene vollständige Umsetzung verwendet proprietäre code für deriveFieldsForName, buildQuery, und myMatch (siehe http://www.basistech.com/text-analytics/rosette/name-indexer/) zu behandeln, mehr Arten von Variationen, die oben nicht genannt sind (z.B. fehlende Leerzeichen, cross-language).