Статьи

Огранка, устранение фильтров и как их использовать

Во время моей повседневной работы я видел много повторных запросов к Solr, с одним отличием только в фильтре. Когда я спросил, почему — я получил ответ, что необходимо получить побочные эффекты для различных фильтров. Если вы используете Solr версии 1.4 или более поздней, я предлагаю использовать локальные параметры — что это такое и как использовать — в этом посте мы попытаемся ответить на оба вопроса.

Предположения

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

  • id — уникальный идентификатор,
  • name — название компании,
  • провинция — провинция, в которой находится компания,
  • город — город, в котором находится компания.

Для простоты я предположил, что поля id , провинция и город основаны на строковом типе. Поле Имя является текст. Поля не являются многозначными, и определение типов такое же, как в стандартном распределении Solr.

Задача

Чего мы хотим достичь? В дополнение к поиску компании, название которой совпадает с введенными пользователем фразами, пользователь дает название провинции и города. Пользователь должен предоставить упрощение всех параметров, чтобы облегчить понимание примера. Мы хотим показать два типа огранки:

  • города, в которых найдены компании, но не сужены до выбранной провинции,
  • все провинции, в которых есть компании, соответствующие запросу.

Стандартный подход

Стандартный подход будет опираться на генерацию двух запросов:

 
q=PHRASE&fq=city:CITY&province:PROVINCE
 
q=PHRASE&facet=true&facet.field=city&facet.field=province

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

Местные параметры

Solr 1.4 принес интересную особенность — местные параметры . В нашем случае важно то, что функция тегирования позволяет фильтровать и исключать фильтры в механизме огранки. Эти два запроса можно заменить следующим образом:

q=PHRASE&fq={!tag=tagCity}city:CITY&fq={!tag=tagProvince}province:PROVINCE&facet=true&facet.field={!ex=tagCity,tagProvince}city&facet.field=!{ex=tagCity,tagProvince}province
 

Как это работает ?

Прежде всего, для каждого фильтра ( параметр fq ) мы определяем уникальный тег, по которому мы можем ссылаться на фильтр. Для этого мы используем следующую структуру {! Tag = TAG_NAME} .

Затем для каждого из полей, которые мы хотим использовать для огранки, мы добавляем информацию, какие фильтры следует исключить. В нашем случае мы исключаем два фильтра в обоих полях при использовании огранки. Для этого мы используем следующую структуру {! Ex = TAG_NAME_1, TAG_NAME_2,…} .

Несколько слов в конце

Конечно, функциональность локальных параметров заключается не только в огранке и возможности исключения фильтра. Я обещаю, что в будущем появится еще одна статья, описывающая более широкие возможности, предлагаемые Solr, и функциональность локальных параметров, представленная в версии 1.4.