Во время моей повседневной работы я видел много повторных запросов к 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.