Статьи

Solr фильтры: PatternReplaceCharFilter

Продолжая обзор фильтров, включенных в Solr сегодня, мы рассмотрим PatternReplaceCharFilter.

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

У вас есть следующие параметры:

  • шаблон (обязательно) — значение, которое нужно изменить (регулярные выражения)
  • замена (по умолчанию: «») — значение, которое будет использоваться в качестве замены для фрагмента, который соответствует регулярному выражению
  • blockDelimiters
  • maxBlockChars (по умолчанию: 10000, должно быть больше 0) — буфер, используемый для сравнения

Используйте примеры

Использовать фильтр просто: мы добавляем его определение к определению типа в файле schema.xml, например:

<fieldType name="textCharNorm" class="solr.TextField">
  <analyzer>
    <charFilter class="solr.PatternReplaceCharFilterFactory" …/>
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  </analyzer>
</fieldType>

Ниже приведены примеры определений для разных случаев.

Вырезать кусочки текста

Вам просто нужно указать в атрибуте pattern, что мы хотим вырезать. Пример:

Вырезать кусочки текста

Вам просто нужно указать в атрибуте pattern, что мы хотим вырезать. Пример:

 
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="#TAG" />

который будет подавлять содержимое элементов данных: «#TAG»

Замена текстовых фрагментов

Случай, аналогичный приведенному выше, но мы хотим преобразовать текст в другой.

 
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="#TAG" replacement="[CENZORED]"/>

Изменение моделей

Два вышеупомянутых случая были тривиальными. Сила этого фильтра заключается в обработке регулярных выражений. (Вы используете регулярные выражения, верно?) Следующий пример прост — он скрывает все числа, превращая их в звезды. Он также обрабатывает числа, разделенные дефисами, рассматривая их как одно число.

 
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(\d+-*\d+)+" replacement="*"/>

Манипулирование текстом

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

 
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(.)\1" replacement="$1"/>

Расширенные параметры

До сих пор я не упомянул следующие параметры: blockDelimiters и maxBlockChars . Если вы посмотрите на исходный код, то увидите, что эти параметры связаны со способом реализации фильтра. CharFilter работает с одним символом, а для сопоставления с образцом требуется внутренний буфер для чтения большего количества символов. MaxBlockChars позволяет вам указать размер буфера. Вам не нужно беспокоиться об этом, если шаблон, который вы определили, не соответствует фрагменту текста размером более 10 тыс. Символов). BlockDelimiters может дополнительно оптимизировать заполнение буфера. Может использоваться, если информацияв анализируемом поле как-то делится на разделы (например, это CSV, предложения и т. д.) Это текст, который сообщает сканеру, что начинается новый раздел, поэтому части, соответствующие предыдущему, больше не нужны.

рамки

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