2013-09-23 14 views
11

Mam kilka dokumentów, które chciałbym posortować w polu daty. W przypadku dokumentów z datą równą określonej dacie, przykład dzisiaj, a wszystkie daty po tym chciałbym sortować rosnąco. W przypadku dat przed określoną datą chciałbym posortować w porządku malejącym.Warunkowe sortowanie w ElasticSearch

Czy to możliwe w ElasticSearch? Jeśli tak, to możesz zaproponować literaturę lub podejście.

data jest typu "date" i formatu "dateOptionalTime".

Dzięki

Odpowiedz

14

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.

+2

jesteś człowiekiem rock !!! – sunshinekitty

3

Dla tego rodzaju szczególnych przypadków użycia, należy użyć sortowania skryptu.

Zobacz sekcję "sortowanie według scenariusza" na stronie Sort documentation.