Jest сортирует результаты по имени

У меня есть индекс Person в моей базе данных ElasticSearch. Я получаю всех людей с помощью этого метода:

public List<Person> findAll() {
    SearchResult result = null;
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(QueryBuilders.matchAllQuery());
    Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(PERSON_INDEX_NAME)
            .addType(PERSON_TYPE_NAME).build();
    try {
        result = client.execute(search);
    } catch (IOException e) {
    }
    List<SearchResult.Hit<Person, Void>> hits = result.getHits(Person.class);
    return hits.stream().map(this::getPerson).collect(Collectors.toList());
}

но я хочу получить результаты, отсортированные в алфавитном порядке по имени (person имеет идентификатор строки и имя строки), но я не могу понять, как это сделать. любая помощь приветствуется


person Fernando Castilla Ospina    schedule 22.02.2017    source источник
comment
этот ответ может помочь: stackoverflow.com/questions/42261521/   -  person Val    schedule 22.02.2017
comment
этот другой вопрос (который, как я только что заметил, тоже мой xDDD) работает, потому что длинный идентификатор, эта сортировка выполняется по имени (строка) не работает: c   -  person Fernando Castilla Ospina    schedule 22.02.2017
comment
И вы не можете сортировать по имени, потому что ваше поле имени анализируется, верно? Вероятно, вам нужно создать еще одно подполе поля имени только для сортировки.   -  person Val    schedule 22.02.2017


Ответы (2)


Какого типа ваше поле имени?

Проблема может заключаться в том, что ElasticSearch разбивает имя на слова, а затем может сортировать по любому слову. Что может дать некоторые довольно случайные результаты (например, имя «Закари А. Зинкштейн» будет высоко оценено, потому что оно содержит букву «А»).

Решение состоит в том, чтобы иметь второе поле, в котором вы устанавливаете тип keyword в сопоставлении и сортируете его.

person Daniel Winterstein    schedule 24.04.2017
comment
спасибо за ваш ответ, я закончил свою работу над этим проектом и был переведен в другой, если я правильно помню, мы изменили поля в БД на «Не анализировать», чтобы ES возвращал уже отсортированные значения. - person Fernando Castilla Ospina; 24.04.2017

Что ж.

я взял список, предоставленный ES, и заказал его, используя метод сортировки коллекций.

person Fernando Castilla Ospina    schedule 22.02.2017
comment
Это не будет правильно сортировать ваши результаты, а только первые десять результатов, которые вы получаете от ES. - person Val; 22.02.2017
comment
Эм-м-м? почему только первые десять? - person Fernando Castilla Ospina; 23.02.2017
comment
Потому что в вашем запросе нет размера, и по умолчанию ES возвращает только первые десять результатов, отсортированных по количеству баллов. Вам нужно немного почитать: elastic .co/guide/en/elasticsearch/reference/current/ ;-) - person Val; 23.02.2017