Рейтинг:4

Как увеличить запрос search_api_solr, если поле имеет значение?

флаг in

Я пытаюсь добавить ускорение к запросу API поиска Solr, когда поле имеет определенное значение, например. когда его nid = 123. Глядя на Документы Solr версии 8.7 для повышения (моя версия сервера solr), это выглядит довольно просто. Мне просто нужно добавить параметр bq, например:

бк=нид:123^10

Когда я захожу в пользовательский интерфейс администратора моего сервера Solr и добавляю туда запрос - сначала проверяю флажок парсера edismax, а затем добавляю нид:123^10 в поле bq — я вижу результаты, в которых мой узел с nid находится вверху списка (как я и ожидал) со всеми остальными результатами после него. Если я удалю эту опцию, мой узел с nid 123 больше не будет вверху (как я и ожидал).

search_api_solr модуль предоставляет хук для изменения запросов, hook_search_api_solr_query_alter(), где я могу добавить свой boost. (Примечание: я использовал этот хук в прошлом, чтобы повысить результаты на основе даты, в основном, как описано в этом комментарий.)

Насколько я понимаю, я должен иметь возможность реализовать что-то вроде:

function MY_MODULE_search_api_solr_query_alter(\Solarium\Core\Query\QueryInterface $solarium_query, \Drupal\search_api\Query\QueryInterface $query) {
  $solarium_query->addParam('bq', 'nid:123^10');
}

Однако это не влияет на оценки релевантности моих результатов (я печатаю оценку релевантности в своем представлении, и мой узел с nid 123 имеет одинаковую оценку независимо от того, добавляю я этот параметр или нет), а также, как и ожидалось, на порядок результаты, достижения.

Что мне здесь не хватает?

Информация о версии:

  • Ядро Друпала: 9.1.10
  • API поиска: 8.x-1.19
  • Решение API поиска: 4.1.12
  • Солр-сервер: 8.7.0

p.s. мой ключ поля nid на самом деле its_nid в индексе, но я просто использовал нид в этом вопросе для удобства чтения.

Рейтинг:5
флаг in

Мне просто нужно было читать внимательнее. Вся информация находится в примере кода в hook_search_api_solr_query_alter() документация. (Я думаю, что формат, который я использовал, мог быть рекомендован для гораздо более старых версий search_api_solr, версий, которые только недавно больше не требуются на некоторых корпоративных хостах.)

Самый простой способ заставить это работать — добавить параметр defType в мой запрос, чтобы указать ему использовать парсер edismax. Это задокументировано в hook_search_api_solr_query_alter(). Следующие работы:

function MY_MODULE_search_api_solr_query_alter(\Solarium\Core\Query\QueryInterface $solarium_query, \Drupal\search_api\Query\QueryInterface $query) {
  $solarium_query->addParam('bq', 'nid:123^10');
  // Избегайте преобразования в выражение синтаксического анализатора lucene, оставьте edismax.
  $solarium_query->addParam('defType', 'edismax');
}

Однако, читая хук документация, он показывает альтернативный подход, который кажется предпочтительным:

function MY_MODULE_search_api_solr_query_alter(\Solarium\Core\Query\QueryInterface $solarium_query, \Drupal\search_api\Query\QueryInterface $query) {
  $boost_queries['special_node'] = [
    'запрос' => 'нид:123^10.0',
  ];
  $boost_queries['some_less_special_node'] = [
    'запрос' => 'нид:321^5.0',
  ];
  /** @var\Solarium\Component\EdisMax $edismax */
  $edismax = $solarium_query->getEDisMax();

  $edismax->addBoostQueries($boost_queries);

  // Избегайте преобразования в выражение синтаксического анализатора lucene, оставьте edismax.
  $solarium_query->addParam('defType', 'edismax');
}

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.