Oui, cela est possible dans ElasticSearch en utilisant un script, que ce soit pour le tri ou pour l'évaluation.
Ma préférence serait pour un script de scoring car le 'score basé sur le script' sera plus rapide (selon la documentation).
À l'aide d'un script de scoring, vous pouvez utiliser l'horodatage Unix pour le champ de date de type int/long
et un script de tri mvel dans la requête custom_score
. Vous devrez peut-être réindexer vos documents. Vous devez également être en mesure de convertir le temps recherché en un horodatage Unix pour le pomper chez ElasticSearch.
Le script de tri déduirait alors l'horodatage demandé de l'horodatage de chaque document et créerait une valeur absolue. Ensuite, les résultats sont triés par ordre croissant - la «distance» la plus basse est la meilleure.
Ainsi, lorsque la recherche de documents datés environ un an il y a, il ressemblerait à quelque chose comme:
"query": {
"custom_score" : {
"query" : {
....
},
"params" : {
"req_date_stamp" : 1348438345,
},
"script" : "abs(doc['timestamp'].value - req_date_timestamp)"
}
},
"sort": {
"_score": {
'order': 'asc'
}
}
(Toutes mes excuses pour toute erreur dans mon JSON - Je l'ai testé cette idée dans pyes
)
Vous pourriez Vous devez modifier cette option pour obtenir l'arrondi correct. Par exemple, votre question mentionne les jours correspondants. Vous pouvez donc arrondir le générateur d'horodatage au jour le plus proche. Pour les informations "complètes", vous pouvez consulter le Custom Score Query docs et suivre le lien vers les scripts MVEL.
vous rock homme !!! – sunshinekitty