bloggers bloggers

Marco Napolitano
Messaggi: 79
Stelle: 0
Data: 17/02/22
Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Paolo Gambetti
Messaggi: 2
Stelle: 0
Data: 11/11/19
Katia Pazzi
Messaggi: 1
Stelle: 0
Data: 27/06/19
Ezio Lombardi
Messaggi: 11
Stelle: 0
Data: 10/04/18
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
Indietro

Ordinamento dei risultati mediante indexer su Liferay 7

Recentemente mi sono trovato a dover lavorare con il motore di indicizzazione di Liferay 7 (che ricordo essere ElasticSearch) per estrarre e visualizzare dati complessi di entità custom.

Una delle esigenze che avevo era quella di ordinare i dati, cosa che mi aspettavo fosse banale; purtroppo ho avuto un pò di problemi ma alla fine sono arrivato ad una soluzione che ora vi illustro, sperando di farvi risparmiare tempo prezioso.

Innanzitutto partiamo dall'indicizzazione delle entità custom, ossia dal metodo doGetDocument della nostra classe Indexer; se vogliamo che un campo sia ordinabile dobbiamo indicizzarlo attraverso uno di questi metodi:

  • addKeywordSortable
  • addTextSortable
  • ...

Questi metodi fanno sì che, all'interno del documento da indicizzare, vengano creati 2 campi diversi: uno che si chiama come il campo stesso, ad esempio code, mentre l'altro si chiama code_String_sortable e viene salvato tutto in minuscolo. L'infisso _String_ dipende dal tipo di dato del campo.

Dopodichè, all'interno della JSP, possiamo creare l'oggetto SearchContext che conterrà tutti i parametri di ricerca, tra cui anche i campi su cui ordinare:

SearchContext searchContext = SearchContextFactory.getInstance(request);
...
searchContext.setSorts(SortFactoryUtil.getSort(MyEntity.class, "code", "asc"));

La definizione di ogni singolo campo di ordinamento deve essere effettuata mediante il medoto SortFactoryUtil.getSort; questo passaggio è fondamentale perchè il metodo getSort analizza la struttura dell'entità per capire come si deve chiamare esattamente il campo di ordinamento e per farlo invoca il metodo doGetSortField della nostra classe Indexer.

L'implementazione di default restituisce semplicemente il nome del campo stesso, pertanto sarà necessario sovrascrivere il metodo per gestire correttamente la nomenclatura:

@Override
protected String doGetSortField(String orderByCol) {
    if ("code".equals(orderByCol))
        return "code_String_sortable";

    return super.doGetSortField(orderByCol);
}

Buon divertimento!

Commenti
Nessun commento. Vuoi essere il primo.