2013-09-23 4 views
11

J'ai quelques documents que j'aimerais trier sur un champ de date. Pour les documents avec une date égale à une date spécifiée, exemple aujourd'hui, et toutes les dates après que je voudrais trier ascendant. Pour les dates antérieures à la date spécifiée, je voudrais trier par ordre décroissant.Tri sélectif dans ElasticSearch

Est-ce possible dans ElasticSearch? Si oui, pourriez-vous suggérer une littérature ou une approche?

La date est de type "date" et le format "dateOptionalTime".

Merci

Répondre

14

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.

+2

vous rock homme !!! – sunshinekitty

3

Pour ce type de cas d'utilisation spécifiques, vous devez utiliser un script de tri. Voir la section "tri basé sur un script" dans la page Sort documentation