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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top