Lucene Index e Query Design Question - Ricerca di persone
-
06-07-2019 - |
Domanda
Di recente ho appena iniziato a lavorare con Lucene (in particolare, Lucene.Net) e ho creato con successo diversi indizi e non ho alcun problema con nessuno di essi. Precedentemente avendo lavorato con Endeca, trovo che Lucene sia leggero, potente e abbia una curva di apprendimento molto più bassa (dovuta principalmente a un'API concisa).
Tuttavia, ho una situazione di indice / query specifica che sto riscontrando problemi a racimolare la mia testa. Quello che ho è una directory personale. Le persone possono essere ricercate in questa applicazione, con l'obiettivo di restituire corrispondenze esatte e approssimative. In questo momento, nell'indice concateno il "Nome" " e " LastName " in un singolo campo chiamato " FullName " ;, aggiungendo uno spazio tra i due. Quindi FirstName: Jon con LastName: Smith ha reso FullName: Jon Smith. Prevedo la possibilità di secondi nomi e possibilmente il suffisso, ma al momento non è importante.
Vorrei fare l'equivalente di una ricerca confusa sul nome, quindi qualcuno che cerca " John Smith " ritornerebbe ancora "Jon Smith". Avevo pensato a una ricerca multipla, tuttavia, questo diventa più coinvolto se il suo nome era in realtà "Jon Del Carmen". o "Jon Paul Del Carmen". Non ho nulla in ciò che l'utente digita per delineare il nome o i pezzi del cognome.
L'unico pensiero che ho è che potrei sostituire gli spazi nel valore concatenato con un personaggio che non verrebbe scartato. Se lo facessi quando ho creato il documento per l'indice e anche quando ho analizzato la query, potrei trattarlo come una parola più grande, giusto? C'è un altro modo per farlo che funzionerebbe sia per i nomi semplici ("Jon Smith") sia per i nomi più complessi ("Jon Paul Del Carmen")?
Qualsiasi consiglio sarebbe davvero apprezzato. Grazie in anticipo!
Modifica: seguono ulteriori dettagli.
In Luke, ho inserito la seguente query:
FullName:jonn smith~
Viene analizzato come:
FullName:jonn CreatedOn:smith~0.5
Con una spiegazione di:
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 " è un altro campo nell'indice. Ho provato a mettere le virgolette intorno al termine "jonn smith", ma invece lo tratta come una frase a frase, invece. Sono sicuro che il problema è che non sto facendo qualcosa di giusto, ma essendo così ecologico in tutto questo, non sono sicuro di cosa sia veramente quel qualcosa.
Soluzione
Il mio problema era con come stavo costruendo l'indice. Quello che ho finito per fare è stato assicurarmi che non stesse tokenizzando il FullName e la query ha iniziato a restituire i risultati corretti. I risultati di Spiegazione di cui sopra erano dovuti a un errore ID10T da parte mia e ora sta tornando correttamente.