Реализовать "случайную" сортировку в поиске гибернации - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу добиться какой-то «случайной» сортировки с помощью библиотеки hibernate searchasticsearch.Я делаю следующее:

Реализация FieldComparator:

public class RandomOrderFieldComparator extends FieldComparator<Integer>  {

  private final Random randomGenerator = new Random();

  @Override
  public int compare(int slot1, int slot2) {
    return randomGenerator.nextInt();
  }

  @Override
  public void setTopValue(Integer value) {
    //not needed as the purpose is to generate random integers w
  }

  @Override
  public Integer value(int slot) {
    return randomGenerator.nextInt();
  }

  @Override
  public LeafFieldComparator getLeafComparator(LeafReaderContext context) throws IOException {
    return null;
  }
}

Реализация FieldComparatorSource

public class SampleFieldComparatorSource extends FieldComparatorSource {

  @Override
  public FieldComparator<?> newComparator(String fieldname, int numHits, int sortPos, boolean reversed) throws IOException {
    return new RandomOrderFieldComparator();
  }
}

Наконец, создайте пользовательский SortField, предоставляющий FieldComparatorSource:

queryBuilder
        .sort()
        .byNative(
            new SortField(
                "id",
                new SampleFieldComparatorSource()
            )
        );

Проблема заключается в том, что он по-прежнему генерирует запрос, используя обычную сортировку в поле 'id', и компаратор никогда не бываетХит:

"sort": [
    {
      "id": {
        "order": "asc"
      }
    }
  ]

Что я делаю не так и каков наилучший способ реализации "случайной" сортировки с использованием библиотеки поиска hibernate?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

На самом деле я нашел способ сделать это с помощью поиска в спящем режиме, передавая непосредственно JSON и используя безболезненный скрипт:

queryBuilder.sort()
          .byNative("_script", "{"
                                  + "\"type\" : \"number\","
                                  + "\"script\" : {"
                                  + "   \"lang\": \"painless\","
                                  + "   \"source\": \"new Random().nextInt()\""
                                  + "},"
                                  + "\"order\" : \"asc\""
                                + "}");
0 голосов
/ 20 февраля 2019

Интеграция Elasticsearch работает путем перевода объектов Lucene в JSON и отправки их в кластер Elasticsearch.Он работает для простых вещей, таких как сортировка по значениям полей, запросам терминов и т. Д., Но он определенно не может перевести Java-объект, который вы реализовали самостоятельно.

Проще говоря, как только вы используете пользовательскую реализациюинтерфейс Lucene, вы можете быть уверены, что он не будет работать с интеграцией Elasticsearch.Таким образом, ваш RandomOrderFieldComparator просто не будет работать.

Если вам нужно выполнять расширенные функции, которые Hibernate Search не предоставляет через свои API, такие как случайная сортировка, вам нужно написать JSON, отправленный вElasticsearch самостоятельно.Stackoverflow предоставляет различные решения для этой проблемы.

EDIT: остальная часть моего ответа была неправильной.Я забыл о нативной сортировке, позор мне.См. другой ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...