2015-05-13 5 views
6

Поиск в спящем режиме сортирует результаты в зависимости от релевантности, это нормально. В дополнение к этому, если два документа имеют одинаковый балл, они упорядочены по их первичным ключам.Hibernate Search sorting

Например,

Книга1: ID = 1, BOOKTITLE = "спящий режим поиска по примеру".

book2: ID = 2, BOOKTITLE = «спящий режим поиска в действии»

Если я делаю запрос для поиска терминов «спящий режим поиска», я бы этот приказ: Книга1 затем book2

Я хотел бы инвертировать этот заказ: book2 then book1. Это означает инвертирование порядка первичного ключа. Есть ли способ сделать это без реализации пользовательского сходства? В то же время соблюдение порядка соответствия.

ответ

7

Да, вам необходимо создать объект Sort, который задает требуемую сортировку и задает ее в запросе. См. Section 5.1.3.3 of the Hibernate docs. Затем в списке SortFields перейдите SortField.FIELD_SCORE. Конструктор SortField также позволяет вам изменить порядок.

org.hibernate.search.FullTextQuery query = s.createFullTextQuery(luceneQuery, MyEntity.class); 
org.apache.lucene.search.Sort sort = new Sort(
    SortField.FIELD_SCORE, 
    new SortField("id", SortField.STRING, true)); 
query.setSort(sort); 
List results = query.list(); 
+0

Если я использую объект «Сортировка», сохраняю ли счет в режиме спящего режима? В приведенном выше примере, если я ищу «поиск в спящем режиме», документ с id = 3, который содержит только термин «спящий режим», будет отсортирован третьим после id = 2 и id = 1? Даже если я инвертирую заказ Id? –

+0

Я сказал это, потому что я попробовал («id», SortField.LONG, true), он отлично работает, но порядок зависит только от идентификатора, а не от идентификатора и документа. –

+0

Вот почему первый «SortField» в сортировке требует быть 'SortField.FIELD_SCORE'. Это говорит о том, что сначала сортировать по результату. – femtoRgon