Solr: сначала сортировка по фразе, потом по дате - PullRequest
0 голосов
/ 10 января 2020

У меня есть Solr (6.2) DisMax Select Query, который использует pf (поля фразы) и ps (фраза slop).

pf = text^2.2 title^2.2, ps = 2;

Я хочу, чтобы мой запрос возвращал результаты в соответствии с этим алгоритмом:

  1. Если есть точные совпадения для запрашиваемой фразы, сначала верните их, сортировка по дате
  2. Если есть документы, содержащие хотя бы одно из слов запрашиваемой фразы, вернуть их вторыми, отсортировать по дате

Пример данных: текст (последняя отметка времени в скобках)

  • материал о важных людях (2018)
  • важных людях: статья (2019)
  • некоторые люди считают это важным (2020 )
  • важные новости (2015)
  • человек десятилетия (2020)

Желаемый результат :

фразы с приемлемым отрывом в первую очередь

  1. некоторые люди считают, что это важно (2020)
  2. важные люди: статья (2019)
  3. материал о важные люди (2018)

тогда хотя бы одно из слов

человек десятилетия (2020) важные новости (2015)

Что я пробовал :

  • оборачивая запрос в двойные кавычки и используя qs (словосочетание словосочетания), таким образом он работает по желанию, но игнорирует часть «хотя бы одно из слов»;
  • с использованием bq (запрос на повышение) ) как last_modified:[NOW/DAY-3MONTH TO NOW/DAY]^20.0;
  • с использованием bf (функция повышения), например recip(ms(NOW,last_modified),3.16e-11,1,1);
  • явная last_modified desc сортировка - но она полностью игнорирует
  • , используя несколько sort score desc, last_modified desc - но вторая сортировка будет работать только в том случае, если для первой будет ie (а в ie почти нет)

1 Ответ

0 голосов
/ 24 января 2020

Мне удалось получить (почти) желаемый результат, используя:

  • Boost Functions (bf) = recip(ms(NOW,last_modified),3.16e-11,1,1)^1500 (пришлось использовать огромное число усиления, чтобы всплыть самые последние результаты);

  • Поля запросов qf = 'text^4 title^2';

  • Поля фраз pf = 'text^5 title^2';

  • Фразовый отстой ps = 4;

  • Запрос Фразовый отстой qs = 2;

  • Минимум должен соответствовать мм = len(split('\s', query)) + 1 (preudocode)

Разбить запрос по пробелу, объединить точную фразу и каждое отдельное слово с помощью OR и установить для параметра Minimum Should Match (mm) значение len (split) +1 так, например, запрос «apple dog» превращается в "apple dog" or apple or dog. Двойные кавычки необходимы для того, чтобы параметр qs работал и заставлял результаты с точной фразой всплывать.

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

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