Дискретные подсказки для адреса
Фильтры можно использовать со всеми командами, где подразумевается обработка почтовых адресов. Фильтр позволяет сообщить сервису дополнительную информацию об адресе, которую сервис будет использовать для улучшения обработки. Фильтры целесообразно использовать, если вам заранее известно, какому региону или городу принадлежит адрес.
Например, если вы обрабатываете адреса ваших клиентов и вам заранее известно, в каких городах или регионах они живут, то эти сведения можно сообщить сервису с помощью фильтра. Благодаря этой дополнительной информации сервис повысит качество стандартизации, а в некоторых случаях даже сможет исправить адреса, которые без использования фильтра были бы отбракованы.
Фильтр передаётся сервису в рамках любой команды, подразумевающей обработку почтового адреса или группы адресов, с помощью опционального параметра afilter. Этот параметр может принимать одно из следующих значений:
afilter={ "priority": [ { "address": "Красноярский край" } ] }
afilter=Московская область
afilter=Владимирская область, город Владимир
afilter=12
Как бы не задавался фильтр, всегда подразумевается, что его описание представляет собой структуру из трёх правил priority, required и rejector. Каждое из этих правил соответствует своему критерию фильтрации, который применяется к обрабатываемому почтовому адресу. Любое из этих правил может быть опущено, в этом случае соответствующий критерий фильтрации применяться не будет.
Каждое из трёх указанных правил представляет собой простое перечисление достаточно крупных адресных объектов (например, городов или регионов), которым должен принадлежать почтовый адрес, для того чтобы в отношении этого адреса сработал соответствующий правилу критерий фильтрации. Как именно следует оформлять такое перечисление, зависит от используемого формата описания фильтра: JSON, XML или простой текст, каждый из которых будет рассмотрен далее. Здесь же рассмотрим критерии фильтрации, соответствующие каждому из указанных трёх правил.
В общем случае все три правила priority, required и rejector могут присутствовать в описании фильтра, однако чаще всего на практике достаточно использовать какой-то один из них.
Ниже приведён пример описания фильтра в формате JSON. Для наглядности у данного фильтра заданы все три правила priority, required и rejector.
{ "priority": [ { "address": "Москва", "level": "Region" } ], "required": [ { "code": "77", "address": "г Москва" }, { "code": "24", "address": "Красноярский край" }, { "address": "обл Иркутская" }, { "address": "Тюменская", "level": "Region" } ], "rejector": [ { "address": "Тюменская область", "level": "Region" }, { "address": "Иркутская", "level": "Region" } ] }
Сам фильтр описывается с помощью JSON-объекта, в рамках которого с помощью дочерних JSON-элементов описываются три правила priority, required и rejector. А именно:
Каждый элемент этих массивов представляет собой JSON-объект, соответствующий одному адресному объекту. Описание этих объектов приведено в следующем подразделе.
Фильтр, описанный выше, действует следующим образом. Среди всех вариантов распознавания адреса сохраняются только те, которые принадлежат четырем регионам обязующего фильтра (см. элемент required): городу Москве, Красноярскому краю, Иркутской области и Тюменской области.
Затем из оставшихся вариантов удаляются адреса, принадлежащие регионам режекторного фильтра (см. элемент rejector). В данном случае такими регионами являются Тюменская и Иркутская области.
Оставшиеся после срабатывания обязующего и режекторного фильтра варианты распознавания адреса обрабатываются приоритетным фильтром, который в нашем случае при прочих равных отдает приоритет адресам из города Москвы (см. элемент priority).
Описание адресного объекта в рамках фильтра может быть выполнено двумя следующими способами.
Примеры задания адресного объекта этими двумя способами приведены ниже.
{ "code": "77" }
{ "address": "Москва", "level": "Region" }
{ "address": "fias:0c5b2444-70a0-4932-980c-b4dc0d3f02b5" }
JSON-объект с описанием адресного объекта может содержать следующие дочерние элементы.
В качестве примера рассмотрим передачу фильтра в рамках команды стандартизации одного адреса cleanse/address. Для простоты возьмём следующий фильтр, состоящий только из одного приоритетного правила, отдающего приоритет адресам города Москвы.
{ "priority": [ { "code": "77", "address": "Москва" } ] }
Данный фильтр содержит только один объект – город Москву, при этом используется способ описания объекта с помощью АБР-кода. Поле "address": "Москва" приведено в описании фильтра для наглядности, при реальном использовании фильтра оно будет игнорироваться, поскольку у объекта явно задан АБР-код "code": "77".
Теперь, имея данный фильтр, с помощью команды cleanse/address можно обработать адрес ул Ткацкая, дом 5, в котором явно опущено название города. Для этого необходимо передать JSON-описание фильтра в рамках параметра afilter следующим образом.
Для наглядности в данном запросе мы не стали преобразовывать в URL-encoding строку запроса query и тело фильтра в параметре afilter. Для реальной обработки данного запроса также следует указать в параметре user настоящий API-токен вашей учётной записи.
Ниже приведён пример описания фильтра в формате XML. Для наглядности у данного фильтра заданы все три правила priority, required и rejector. Данный фильтр эквивалентен фильтру, описанному выше в формате JSON.
<filters> <!-- список регионов приоритетного правила --> <priority> <item address="г Москва" level="Region"/> </priority> <!-- список регионов обязующего правила --> <required> <item code="77" address="г Москва"/> <item address="Красноярский край"/> <item address="обл Иркутская"/> <item address="Тюменская" level="Region"/> </required> <!-- список регионов режекторного правила --> <rejector> <item address="Тюменская область" level="Region"/> <item address="Иркутская" level="Region"/> </rejector> </filters>
Описание каждого из трех правил фильтра: приоритетного, обязующего и режекторного выполняется с помощью дочерних XML-элементов priority, required и rejector соответственно. Они в свою очередь содержат списки дочерних XML-элементов item, каждый из которых содержит описание одного из адресных объектов фильтра. Описание этих объектов приведено в следующем подразделе.
Адресные объекты, как и в случае с JSON-представлением, могут задаваться несколькими способами: с помощью АБР-кода, посредством текстового описания и в виде ссылки на объект классификатора. Примеры задания адресного объекта этими способами приведены ниже.
<item code="77" address="г Москва"/>
<item address="г Москва" level="Region"/>
<item address="fias:0c5b2444-70a0-4932-980c-b4dc0d3f02b5"/>
XML-элемент item с описанием адресного объекта может содержать следующие атрибуты.
По аналогии с примером для JSON-описания фильтра, в качестве примера рассмотрим передачу фильтра в рамках команды стандартизации одного адреса cleanse/address. Возьмём следующий фильтр, состоящий только из одного приоритетного правила, отдающего приоритет адресам города Москвы.
<filters> <priority> <item code="77" address="г Москва"/> </priority> </filters>
Данный фильтр содержит только один объект – город Москву, при этом используется способ описания объекта с помощью АБР-кода.
Имея данный фильтр, с помощью команды cleanse/address можно обработать адрес ул Ткацкая, дом 5, в котором явно опущено название города. Для этого необходимо передать XML-описание фильтра в рамках параметра afilter следующим образом.
Для наглядности в данном запросе мы не стали преобразовывать в URL-encoding строку запроса query и тело фильтра в параметре afilter. Для реальной обработки данного запроса также следует указать в параметре user настоящий API-токен вашей учётной записи.
Данный способ описания фильтра можно использовать, если требуется задать фильтр, содержащий только приоритетное правило. Иными словами, текстовое описание фильтра задаёт перечень адресных объектов правила priority, тогда как правила required и rejector опускаются, т.е. полагается, что в фильтре они просто не заданы.
В этом случае можно отказаться от JSON и XML конструкций, а вместо этого передавать перечень объектов фильтра в виде обычной строки, в которой описания объектов разделены вертикальной чертой.
Например, если мы хотим использовать приоритетный фильтр, отдающий предпочтение адресам из Брянской и Ростовской областей, то текстовое описание такого фильтра будет иметь следующий вид.
Как видно из этого примера, адресные объекты задаются в виде списка, в котором они отделены друг от друга вертикальной чертой.
Имея данный фильтр, с помощью команды cleanse/address можно обработать адрес Ивановка, ул Ленина, в котором явно опущено название региона. Для этого необходимо передать текстовое описание фильтра в рамках параметра afilter следующим образом.
Для наглядности в данном запросе мы не стали преобразовывать в URL-encoding строку запроса query и тело фильтра в параметре afilter. Для реальной обработки данного запроса также следует указать в параметре user настоящий API-токен вашей учётной записи.
В результате обработки такого запроса из всех адресов, соответствующих множеству деревень и посёлков с именем Ивановка, сервис вернёт только адреса, принадлежащие Брянской и Ростовской областям, поскольку именно они указаны в фильтре.