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.
you rock man !!! – sunshinekitty