Solr filtry: PatternReplaceCharFilter

Kontynuując przeglad filtrów dostępnych w Solr dziś przyglądamy się pracy PatternReplaceCharFilter.

Jak łatwo się domyślić zadaniem filtra jest zamiana w strumieniu wejściowym tych fragmentów, które pasują do danego wyrażenia regularnego.

Dostępne są następujące parametry:

  • pattern (wymagany) – wartość, która zostanie zamieniona (wyrażenie regularne)
  • replacement (domyślnie: „”) – wartość, którą zostanie zastąpiony dopasowany do wyrażenia regularnego fragment
  • blockDelimiters
  • maxBlockChars (domyślnie: 10000, większe od 0) – bufor używany przy porówaniu

Przykłady wykorzystania

Wykorzystanie filtru sprowadza się do dodania jego definicji w definicji typu pola w schema.xml np.:

<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>

Poniżej przykładowe definicje dla różnych przypadków.

Wycinanie fragmentów tekstu

To najprostszy przypadek. Należy tylko podać w atrybucie pattern to co chcemy wyciąć i już. Przykład:

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

co spowoduje pomijanie w treści danych elementów: „#TAG”

Zamiana fragmentów tekstu

Przypadek podobny do tego wyżej, natomiast chcemy zamienić tekst na inny.

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

Zamiana wzorców

Powyższe przypadki były trywialne. To, co stanowi o sile tego filtru to obsługa wyrażeń regularnych. (Używasz wyrażeń regularnych, prawda?) Poniższy przykład jest prosty – ukrywa wszystkie liczby (zamieniając je na gwiazdki). Radzi sobie również z liczbami oddzielonymi myślnikami, traktując je jako pojedyncze liczby.

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

Manipulacja tekstem

Tekst zastępujący nie musi być prostym tekstem. Obsługiwane są tzw. odwołania wsteczne, które pozwalają na odwołanie się do fragmentów dopasowanego wzorca. Po szczegóły odsyłam do dokumentacji wyrażeń regularnych. W poniższym przykładzie wszystkie zwielokrotnione znaki zastępowane są znakiem pojedynczym.

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

Parametry zaawansowane

Do tej pory nie wspomniałem o parametrach: blockDelimiters i maxBlockChars. Jak wynika ze źródeł filtra, są one związane ze sposobem jego implementacji. CharFilter z założenia operuje na pojedynczych znakach, natomiast dopasowanie wzorca wymaga wczytania do wewnętrznego bufora większej liczby znaków. MaxBlockChars pozwala na okreśłenie rozmiaru tego bufora. W zasadzie nie musisz się tym martwić, jeśli wzorzec, który zdefiniowałeś, nie powoduje dopasowania większego kawałka tekstu (większy oznacza tu powyżej 10tys znaków). BlockDelimiters pozwala dodatkowo zoptymalizować wypełnianie tego bufora. Może być używany, jeśli informacja w analizowanym polu jest w jakiś sposób podzielona na sekcje (np. jest to CSV, zdania itp.). Jest to tekst, który informuje skaner, że zaczyna się nowa sekcja, w związku z tym, ew fragmenty dopasowania z poprzedniej sekcji już się nie przydadzą.

Ograniczenia

Ważnym ograniczeniem filtra jest to, że w bezpośredni sposób manipuluje napisem wejściowym, nie zachowując informacji związanych z początkowym tekstem. Oznacza to, że jeśli filtr usunie jakiś fragment napisu, lub doda nowy fragment, tokenizer tego nie zauważy i położenie tokenów w oryginalnym polu nie zostanie poprawnie zapisane. Trzeba mieć tego świadomość w sytuacji używania zapytań biorących pod uwagę wzajemne położenie słów oraz w przypadku używania highlightingu.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *