1

나는 Elasticsearch에 흥미로운 정렬 문제가 있습니다.스크립트를 사용하여 날짜의 버킷을 정렬하는 Elasticsearch

Item =>  A  B  C   D E F 
Time => -3 -2  -1 0 1 2 3 

상기 그래픽 I 데이터의 6 개 항목 A-F를 가지고 있다고 나타내고, 그들 각각은 현재 시간 (T0)이고, -3, 3 사이의 특정 시간에 발생 : I는 다음과 같은 데이터를 갖는다.

말을하는 것입니다
DEFCBA 

, 미래에 일어나는 모든 항목이 결과에 먼저 배치하고 정렬됩니다 : 나는 다음과 같은 순서로 항목을 정렬 Elasticsearch의 종류를 만들기 위해 찾고

오름차순으로, 과거에 발생한 모든 항목이 결과에서 두 번째로 위치하며 내림차순으로 정렬됩니다.

sort: [ 
    { 
    _script: { 
     type: 'number', 
     script: { 
     lang: 'painless', 
     inline: "if (doc['item_date'].value - params.current_time > 0) {return 1;} else {return 0}", 
     params: { 
      current_time, 
     }, 
     }, 
     order: 'desc', 
    }, 
    }, 
    { item_date: { order: 'desc' } }, 
] 

위의 두 번째, 먼저 과거의 항목을 미래 항목을 배치 할 수 있지만, 오름차순으로 미래 항목을 주문하지 않는다 (이것은 과거를 정렬합니다

지금까지, 나는 다음과 같은 종류가 항목 및 내림차순으로 해당 항목의 모든 항목).

첫 번째 스크립트의 결과를 기반으로 과거 항목과 별도로 미래 항목을 정렬하기 위해 작성할 수있는 스크립트가 확실하지 않습니다.

도움을 주시면 감사하겠습니다.

답변

2

나는 가까운 미래이지만 "미래"날짜에 대해 1 대신 몇 가지 값을 반환해야한다고 생각합니다.

1.0/doc['start_date'].value에 1을 대입하여 날짜에 반비례 (더 큰 날짜 값이 미래에 있음)로 시도하십시오. 위와 같이

전체 예 :

sort: [ 
    { 
    _script: { 
     type: 'number', 
     script: { 
     lang: 'painless', 
     inline: "if (doc['item_date'].value > params.current_time) {return 1.0/doc['start_date'].value;} else {return 0}", 
     params: { 
      current_time, 
     }, 
     }, 
     order: 'desc', 
    }, 
    }, 
    { item_date: { order: 'desc' } }, 
] 
+1

딱! 고맙습니다! –