2015-07-10 2 views
2

У меня есть 2 поля в эластичном типе, а именно timeCreated и timeUpdated. Теперь мое дело в том, что мы всегда должны заказывать timeUpdated, если это не null (или вообще не существует), что, очевидно, оставляет нас с timeCreated, то есть всегда.Упорядочить по времениОбновлено, если существует, в противном случае timeCreated

Теперь, когда я понимаю, как сортировка в elasticsearch работает, следующее не будет работать, потому что оно будет сортироваться по timeUpdated AND timeCreated вместе, а не так, как я и ищу.

"query": { 
    "match_all": {} 
}, 
"sort": { 
    "timeUpdated": {"order": "desc", "missing": "_last"}, 
    "timeCreated": {"order": "desc"} 
} 

Я не совсем уверен, возможно ли это или нет, но упругая является удивительным, так что я надеюсь, что это простая вещь, которую я пропустил в документации.

Я использую последнюю версию (1.6, я считаю) с помощью PHP, используя Elastica (хотя это делает нулевую разницу с исходным вопросом).

РЕДАКТИРОВАТЬ

В качестве примера, если у меня есть 3 документы:

1 - {"timeCreated": "2015-07-08T08:00:00Z"}, 
2 - {"timeCreated": "2015-05-08T10:00:00Z", "timeUpdated": "2015-07-09T08:00:00"} 
3 - {"timeCreated": "2015-07-10T08:00:00Z"} 

Порядок оно должно отображаться в должен быть 3, 2, 1. То, что я получаю, - 2, 3, 1.

+0

То, что вы должны быть размещены именно то, что вам нужно. Это не работает? –

+0

@AndreiStefan, насколько я понимаю, при таком подходе «нулевые» документы будут правы в «нижней части» списка, а затем этот «нижний» раздел «списка сортировки» будет отсортирован в соответствии с 'timeCreated'. Если мое понимание вокруг этого неверно, я явно что-то пропустил. – iLikeBreakfast

+0

Ох, я вижу сейчас. Тогда вам нужна сортировка 'script'. –

ответ

5

Вам нужно script сортировка в этом случае:

{ 
    "query": { 
    "match_all": {} 
    }, 
    "sort": { 
    "_script": { 
     "script": "if (doc['timeUpdated'].value != 0) doc['timeUpdated'].value else doc['timeCreated'].value", 
     "type": "number", 
     "order": "desc" 
    } 
    } 
} 
+0

Это сделало трюк, спасибо! Для всех, кто получает ошибки в встроенных сценариях, не разрешается, https://www.elastic.co/guide/en/elasticsearch/reference/1.6/modules-scripting.html помог мне – iLikeBreakfast

Смежные вопросы