Программно сделать прямой запрос с «И», «ИЛИ», «НЕ» в API поиска Solr Drupal 8 - PullRequest
0 голосов
/ 25 января 2019

Я новичок в Drupal.Я пытаюсь реализовать расширенный поиск на моем сайте Drupal8.Он отлично работает с логическим оператором OR и AND, но не с NOT, +, -.

Вот мой запрос:

$index = \Drupal\search_api\Entity\Index::load('videos_full');
    $query = $index->query();
    $parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode')
                  ->createInstance('direct');
    $query->setParseMode($parse_mode);
    $query->addCondition('search_api_language', \Drupal::languageManager()->getCurrentLanguage()->getId());
    $query->addCondition("status",5);

    $query->setFulltextFields(['field_title', 'title', 'resourcetype', 'tag', 'choreographer', 'director', 'producer', 'structure', 'contributor', 'secondaryauthor']);
    $query->keys($search);

    $query->sort('created','DESC');
    $results = $query->execute();

ДляНапример, если я набираю "iggy НЕ pop", у меня много результатов с "iggy pop"

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Строка поискового запроса в drupal очищена, и, вероятно, поэтому вы не сможете использовать solr + / -

. Что бы я сделал, это настроил очистку запросов в Drupal, чтобы просто разрешить+ и -.Оператор solr - единственный способ достичь функциональности НЕ.

Надеюсь, это поможет.

0 голосов
/ 17 мая 2019

Я попробовал ваш код и не могу подтвердить

Отлично работает с логическим оператором ИЛИ и AND

При вводе

iggy ИЛИ pop

он выполняет поиск «И», результаты не включают в себя контент только с «iggy» или просто «поп». Вы уверены, что операторы могут быть установлены так?

Я прочитал кое-что о

$parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode')
  ->createInstance('direct');
$parse_mode->setConjunction('OR');
$query->setParseMode($parse_mode);

в документах, но, похоже, это тоже не работает. «iggy pop» и «iggy OR pop» не находят контент только с помощью «iggy», это как «И» принудительно.

Единственный способ, с помощью которого я работал с операторами, - это указание массива для запроса вместо строки:

$search_string_exploded = str_word_count($search_string, 1);
$keys = array_merge($search_string_exploded, ['#conjunction' => 'OR']);
$query->keys($keys);

Может быть, это немного помогает.

...