Пользовательский порядок полнотекстового поиска Hibernate по

Мы хотим добавить пользовательский порядок, чтобы перевести полнотекстовый поиск в режим гибернации, предположим, мы хотим искать запись на основе местоположения, если местоположение — «страна, штат, город».

Затем мы хотим иметь поиск с записями в топе, которые находятся рядом с пользователем

Мы прошли по следующим ссылкам.

с использованием порядка mysql в зависимости от случая в критериях спящего режима

Но предложение order by не добавляется, когда мы добавляем его в объект критериев

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

Sort sort = new Sort( new SortField( "location", SortField.Type.STRING, false ) );
fullTextQuery.setSort( sort );

Это поиск на основе геолокации.

мы сохраняем значение местоположения в столбце таблицы mysql как «Индия, Карнатака, Бангалор». Предположим, что пользователь из Бангалора входит в систему, нам нужно показать записи, которые из Бангалора, сначала вверху.

Было бы полезно, если бы мы получили некоторую информацию об этом или любом другом способе решения этой проблемы.

Спасибо, Мохсин.


person Mohsin    schedule 24.02.2016    source источник
comment
Мне не совсем понятно, о чем вы спрашиваете. Вы хотите отсортировать запрос Hibernate Criteria или полнотекстовый запрос Hibernate Search? И что вы имеете в виду под записями в топе, которые находятся рядом с пользователем? Вы имеете в виду геолокационный поиск? Тогда вам могут быть интересны пространственные функции в Hibernate Search.   -  person Gunnar    schedule 24.02.2016
comment
Привет, Гуннар, да, мы выполняем поиск по географическому местоположению, мы сохраняем значение в столбце mysql, скажем, местоположение, значение для этого столбца может быть. Индия, Карнатака, Бангалор, когда пользователь из Бангалора вошел в систему, нам нужно показать записи, которые из Бангалора сначала вверху, остальные ниже.   -  person Mohsin    schedule 24.02.2016


Ответы (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];

Наконец, вы также можете изменить формулу оценки по своему вкусу или прочитать о реализация подобия по умолчанию, чтобы помочь понять систему подсчета очков и формулу "объяснения".

person Sanne    schedule 24.02.2016