Frage

Ich habe vor kurzem gerade erst begonnen mit Lucene arbeiten (insbesondere Lucene.Net) und haben erfolgreich mehrere indicies und haben kein Problem mit einem von ihnen. Zuvor mit Endeca gearbeitet zu haben, finde ich, dass Lucene ist leicht, leistungsstark und hat eine viel niedrigere Lernkurve (vor allem aufgrund einer prägnanten API).

Allerdings habe ich einen bestimmten Index / query Situation, die ich Probleme Einwickeln meinen Kopf herum habe. Was ich habe, ist eine Person Verzeichnis. Die Menschen können in dieser Anwendung gesucht werden, mit dem Ziel, sowohl genaue und ungefähre Übereinstimmungen zurückzukehren. Gerade jetzt, in den Index verketten ich die „Vorname“ und „Nachname“ in ein einziges Feld namens „Fullname“ und fügte hinzu, um einen Raum zwischen den beiden. So Vorname: Jon mit Name: Smith ergeben Fullname: Jon Smith. Ich mache die Möglichkeit der Mittelnamen antizipieren und möglicherweise Suffix, aber das ist im Moment nicht wichtig.

Ich möchte das Äquivalent einer Fuzzy-Suche nach dem Namen zu tun, also jemand für „John Smith“ noch auf der Suche zurück „Jon Smith“ bekommen würde. Ich hatte gedacht, über eine Multisearch dies jedoch mehr beteiligt wird, wenn sein Name eigentlich „Jon Del Carmen“ oder „Jon Paul Del Carmen“ war. Ich habe nichts, was in dem Benutzer die Vornamen oder Nachnamen Stücke zu beschreiben.

Der einzige Gedanke, dass ich habe, ist, dass ich Räume in dem verketteten Wert mit einem Zeichen ersetzen könnte, die nicht verworfen werden würden. Wenn ich dies tat, als ich das Dokument für den Index erstellt und auch wenn ich die Abfrage analysiert, konnte ich es als ein größeres Wort, richtig behandeln? Gibt es eine andere Möglichkeit, dies zu tun, die für einfache Namen ( „Jon Smith“) und auch komplexere Namen ( „Jon Paul Del Carmen“)?

funktionieren würde

Jede mögliche Beratung wirklich geschätzt. Vielen Dank im Voraus!

Edit: Ein zusätzliches Detail folgt

.

In Lukas, habe ich in der folgenden Abfrage:

FullName:jonn smith~

Es wird analysiert, wie:

FullName:jonn CreatedOn:smith~0.5

mit einer Erklärung:

BooleanQuery:boost=1.0000
    clauses=2, maxClauses=1024
    Clause 0: SHOULD
        TermQuery:boost=1.0000
            Term: field='FullName' text='jonn'
    Cluase 1: SHOULD
        FuzzyQuery: boost=1.0000
            prefixLen=0, minSimilarity=0.5000
            org.apache.lucene.search.FuzzyTermEnum: diff=-1.0000
            FilteredTermEnum: Exception null

"CreatedOn" ist ein weiteres Feld im Index. Ich habe versucht, Anführungszeichen um den Begriff „jonn smith“, aber es dann behandelt sie wie ein phrasequery setzen, statt. Ich bin sicher, dass das Problem ist, dass ich einfach nicht etwas richtig machen, aber dies alles so grün zu sein, ich bin nicht sicher, was das etwas wirklich ist.

War es hilfreich?

Lösung

Mein Problem war, mit, wie ich den Index aufbaute. Was ich am Ende war dabei, sicherzustellen, dass es nicht den Fullnamen wurde Tokenerstellung und die Abfrage gestartet, um die richtigen Ergebnisse zurück. Die Erklären Ergebnisse von oben waren aufgrund eines ID10T Fehler meinerseits und nun zurückkehren richtig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top