Domanda

Ho avuto questo problema a lungo termine nel non capire bene come implementare un ordinamento o una classifica Lucene decente.Supponiamo che io abbia un elenco di città e delle loro popolazioni.Se qualcuno cerca "nuovo" o "londra", voglio l'elenco delle corrispondenze del prefisso ordinato per popolazione, e posso farlo lavorando con una ricerca per prefisso e un ordinamento per campo invertito, dove c'è un campo popolazione, IE New Mexico, New York ;o Londra, Londonderry.

Tuttavia, voglio sempre che il nome corrispondente esatto sia in alto.Quindi nel caso di "Londra" l'elenco dovrebbe mostrare "Londra, Londra, Londonderry" dove la prima Londra si trova nel Regno Unito e la seconda Londra è nel Connecticut, anche se Londonderry ha una popolazione più elevata di Londra CT.

Qualcuno ha un'unica soluzione per la query?

È stato utile?

Soluzione

dlamblin, fammi vedere se ho capito bene:Si desidera creare una query basata su prefisso, quindi ordinare i risultati per popolazione e magari combinare l'ordinamento con la preferenza per le corrispondenze esatte.Ti suggerisco di separare la ricerca dall'ordinamento e di utilizzare un CustomSorter per l'ordinamento:Ecco un post sul blog che descrive un selezionatore personalizzato. Il classico libro di Lucene lo descrive bene.

Altri suggerimenti

API per

Ordinacomparatore

dice

C'è un comparabile distinto per ogni termine unico nel campo: se alcuni documenti hanno lo stesso termine nel campo, l'array della cache avrà voci che fanno riferimento allo stesso comparabile

Puoi applicare a

CampoSortedHitQueue

al sortcomparator che ha un campo Comparator per il quale l'api dice ...

Memorizza un comparatore corrispondente a ciascun campo che viene ordinato.

Pertanto il termine può essere ordinato di conseguenza

La mia soluzione attuale è creare un ricercatore esatto e un ricercatore di prefisso, entrambi ordinati per popolazione inversa, quindi copiare tutti i miei risultati iniziando dai risultati esatti, passando ai risultati del prefisso.Rende la paginazione dei miei risultati leggermente più fastidiosa di quanto penso dovrebbe essere.

Inoltre ho utilizzato un hash per eliminare i duplicati, ma in seguito ho modificato il ricercatore del prefisso in una query booleana di ricerca del prefisso (MUST) con una ricerca esatta (NON DEVE), per fare in modo che Lucene rimuovesse i duplicati.Anche se questo sembrava ancora più dispendioso.

Modificare:Spostato in un commento (poiché la funzionalità ora esiste): Yuval F Grazie per il tuo post sul blog ...Come fa il comparatore di ordinamento a sapere che il campo del nome "londra" corrisponde esattamente al termine di ricerca "londra" se non può accedere al termine di ricerca?

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