2013-09-23 7 views
11

Ho alcuni documenti che vorrei ordinare su un campo data. Per i documenti con data uguale a una data specificata, esempio oggi e tutte le date successive desidero ordinare in ordine crescente. Per le date precedenti alla data specificata, desidero ordinare in ordine decrescente.Ordinamento condizionato in ElasticSearch

E 'possibile in ElasticSearch? Se così fosse, potresti suggerire qualche letteratura o un approccio.

data è di tipo "data" e formato "dateOptionalTime".

Grazie

risposta

14

Sì, questo è possibile in ElasticSearch utilizzando uno script, sia per l'ordinamento che per il calcolo del punteggio.

La mia preferenza sarebbe per uno script di punteggio perché "punteggio basato su script" sarà più veloce (in base alla documentazione).

Utilizzando uno script di calcolo del punteggio, è possibile utilizzare il timestamp Unix per il campo data di tipo int/long e uno script di ordinamento mvel nella query custom_score. Potrebbe essere necessario indicizzare nuovamente i documenti. Dovresti anche essere in grado di convertire il tempo cercato in un timestamp Unix per pomparlo su ElasticSearch.

Lo script di ordinamento dedurrebbe quindi il timestamp richiesto dal timestamp di ciascun documento e ne determinerebbe un valore assoluto. Quindi i risultati sono ordinati in ordine crescente - la 'distanza' più bassa è la migliore.

Così, quando alla ricerca di documenti datati circa un anno fa, sarebbe simile:

"query": { 
    "custom_score" : { 
     "query" : { 
      .... 
     }, 
     "params" : { 
      "req_date_stamp" : 1348438345, 
     }, 
     "script" : "abs(doc['timestamp'].value - req_date_timestamp)" 
    } 
}, 
"sort": { 
    "_score": { 
     'order': 'asc' 
    } 
} 

(Ci scusiamo per eventuali errori nella mia JSON - Ho testato questa idea in pyes)

Potrebbero è necessario modificare questo aspetto per ottenere l'arrotondamento corretto, ad esempio la tua domanda menziona i giorni corrispondenti, quindi potresti voler arrotondare il generatore di timestamp al giorno più vicino.

Per informazioni "complete" è possibile controllare lo Custom Score Query docs e seguire il collegamento allo script MVEL.

+2

you rock man !!! – sunshinekitty

3

Per questo tipo di specifici casi d'uso, è necessario utilizzare uno script di ordinamento.

Vedere la sezione "Ordinamento basato su script" nella pagina Sort documentation.