Tak, jest to możliwe w ElasticSearch za pomocą skryptu, do sortowania lub punktowania.
Moja preferencja byłaby dla skryptu punktacji, ponieważ "wynik oparty na skrypcie" będzie szybszy (zgodnie z dokumentacją).
Za pomocą skryptu scoringowego można użyć znacznika czasu Unix dla pola daty typu int/long
i skryptu sortowania mvel w zapytaniu custom_score
. Może być konieczne ponowne zindeksowanie dokumentów. Konieczne będzie także przekonwertowanie wyszukanego czasu na znacznik uniksowy, aby przepompować go w ElasticSearch.
Skrypt sortujący odliczy następnie żądany znacznik czasu od znacznika czasu każdego dokumentu i wprowadzi wartość bezwzględną. Następnie wyniki posortowane są w porządku rosnącym - najniższy "dystans" jest najlepszy.
Więc przy poszukiwaniu dokumentów datowanych około rok temu, byłoby to wyglądać mniej więcej tak:
"query": {
"custom_score" : {
"query" : {
....
},
"params" : {
"req_date_stamp" : 1348438345,
},
"script" : "abs(doc['timestamp'].value - req_date_timestamp)"
}
},
"sort": {
"_score": {
'order': 'asc'
}
}
(przepraszam za ewentualne błędy w moim JSON - Przetestowałem ten pomysł w pyes
)
Mógłbyś trzeba to poprawić, aby uzyskać zaokrąglenie w prawo - na przykład pytanie wymienia pasujące dni, więc możesz zaokrąglić generator znacznika czasu do najbliższego dnia.
Aby uzyskać informacje "pełne", można sprawdzić kod Custom Score Query docs i kliknąć łącze do skryptów MVEL.
jesteś człowiekiem rock !!! – sunshinekitty