Hibernate заказ полнотекстового поиска по
Мы хотим добавить пользовательский порядок в спящий полнотекстовый поиск, предположим, что мы хотим искать записи на основе местоположения, если местоположение "страна, штат, город"
Тогда мы хотим иметь поиск с записями в верхней части, которые находятся рядом с пользователем
Мы перешли по следующим ссылкам.
использование mysql "порядок в каждом случае" в критериях гибернации
Но предложение order by не добавляется, когда мы добавляем его в объект критерия.
Сортировка работает только тогда, когда мы установили объект полнотекстового запроса, как показано ниже, здесь мы можем делать только asc и desc, динамический порядок - нет.
Sort sort = new Sort( new SortField( "location", SortField.Type.STRING, false ) );
fullTextQuery.setSort( sort );
Это поиск на основе географического местоположения.
мы храним значение местоположения в столбце таблицы mysql, так как "Индия, Карнатака, Бангалор" предполагают, что пользователь из логинов Бангалора должен показывать записи из Бангалора первыми вверху.
Было бы полезно, если бы мы получили некоторую информацию об этом или любом другом способе решения этой проблемы.
Спасибо, Мохсин
1 ответ
Звучит так, будто вы не хотите буквально "сортировать" эти результаты, но вы хотите, чтобы результаты, которые соответствуют местоположению, имели очень высокий рейтинг, поэтому они должны быть на вершине при выполнении запроса, отсортированного по счету.
Помните, что полнотекстовый поиск по умолчанию будет возвращать результаты, отсортированные по релевантности, поэтому совпадения, наиболее похожие на запрос, будут возвращаться первыми. Понятие "сходство" - это то, что вы можете контролировать - и в этом смысл использования более мощного полнотекстового движка, чем реляционный запрос.
Таким образом, вы можете получить свои результаты, которые имеют "местоположение", совпадающее с "Бангалором", добавив логическое предложение с оператором SHOULD и значительно повысив оценку.
Например, вы могли бы:
Query combinedQuery = querybuilder
.bool()
.must( originalQuery )
.should( querybuilder.keyword().onField("location").matching(place_keyword).createQuery(); )
.createQuery();
Смотрите эти раздел документации:
- Усиление, чтобы придать полю "местоположение" больший вес при вычислении баллов
- Объединение запросов
Вы можете проверить, как бустинг и вес рассчитываются с помощью прогнозов с запросами. Вы можете получить его с помощью простого балла или даже полного объяснения того, почему этот балл получил это значение; например:
org.hibernate.search.FullTextQuery query =
s.createFullTextQuery(luceneQuery, YourEntity.class);
query.setProjection(
FullTextQuery.SCORE,
FullTextQuery.EXPLANATION,
FullTextQuery.THIS);
List results = query.list();
Object[] firstResult = (Object[]) results.get(0);
float score = firstResult[0];
String explanation = firstResult[1];
YourEntity o = (YourEntity) firstResult[2];
Наконец, вы также можете изменить формулу оценки по своему вкусу или прочитать о реализации сходства по умолчанию, чтобы помочь понять систему оценки и формулу "объяснения".