Как сортировать записи elasticsearch на основе нескольких полей с помощью Java API?

У меня есть требование, когда мне нужно сортировать на основе двух полей, где одно поле имеет тип даты, и оно всегда будет иметь значение при сортировке, а другое поле может быть нулевым или может содержать значение даты. Мне нужно отсортировать записи в порядке убывания на основе первого поля, а второе поле должно быть нулевым. Я ищу решение в Java Elasticsearch API

SearchRequest('test').source(SearchSourceBuilder()
      .query(QueryBuilders
               .boolQuery()
               .must(QueryBuilders.boolQuery().should(QueryBuilders.termQuery("name.keyword","george"))).sort(SortBuilders.fieldSort("createdOn").order(SortOrder.DESC)).sort(SortBuilders.scriptSort(Script("doc['updatedOn'].value == null", ScriptSortType.String)))

person Srihari GouthamGr    schedule 08.06.2020    source источник


Ответы (1)


Это решение работало в моем тестовом коде (Elasticsearch-7.6.1):

.sort(SortBuilders.scriptSort(new Script(ScriptType.INLINE, "expression", "doc['updatedOn'].empty ? 0 : 1", Collections.emptyMap(), Collections.emptyMap()), ScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.DESC))
person Alexander Raithel    schedule 08.06.2020
comment
Здравствуйте, Александр, спасибо за ответ, но это решение не работает. А также согласно документам отсутствующее свойство работает только в том случае, если поле не существует, но в моем случае поле будет существовать, но значение будет нулевым. - person Srihari GouthamGr; 09.06.2020
comment
Я изменил свой ответ и теперь использую «scriptSort», как в вашем примере. - person Alexander Raithel; 09.06.2020
comment
Эй, это здорово. Спасибо за повторное посещение вашего ответа. И я попробую это и дам вам знать. Но не могли бы вы просто сообщить мне, как именно вы их изучаете? Я не нашел хорошей документации с примерами API Elasticsearch Java. - person Srihari GouthamGr; 09.06.2020
comment
SearchRequest('test').source(SearchSourceBuilder() .query(QueryBuilders.boolQuery().must(QueryBuilders.boolQuery().should(QueryBuilders.termQuery(name.keyword,george))).sort(SortBuilders.fieldSort( createdOn).order(SortOrder.DESC))..sort(SortBuilders.scriptSort(новый Script(ScriptType.INLINE, выражение, doc['updatedOn'].empty ? 0: 1, Collections.emptyMap(), Collections.emptyMap( )), ScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.DESC))) - person Srihari GouthamGr; 09.06.2020
comment
Я буду тестировать приведенный выше запрос, который включает ваше решение. Просто для справки. Спасибо :) - person Srihari GouthamGr; 09.06.2020
comment
Рад помочь! Я также нашел очень мало документации об этом и поэтому немного попробовал... - person Alexander Raithel; 09.06.2020