Если вы хотите создать подкласс TokenFilter
, вам нужно взглянуть на него:
Первое представление об архитектуре TokenFilter
- это абстрактный класс;подклассы должны переопределять incrementToken()
.Также в нем есть несколько методов - end()
, close()
, reset()
.Очень важно вызывать супер методы, если вы переопределяете его.
Однако большинство вещей происходит в incrementToken()
.Общая архитектура такова, что в вашем incrementToken
вам нужно вызвать входящий вам TokenStream
вход - чтобы получить следующий токен (давайте представим, что ваш родитель TokenStream
равен WhitespaceTokenizer
), а затем обновил атрибуты токена, такони будут доступны позже.
Существует около 10 атрибутов токена, которые уже существуют, и, скорее всего, вам просто нужно их использовать.Позвольте мне назвать несколько важных: CharTermAttribute
(содержит текст токена), PositionIncrementAttribute
(установить расстояние от предыдущего термина, по умолчанию 1), PositionLengthAttribute
(большинство анализаторов игнорируют его, но это можетбыть полезным в обработке NLP, чтобы фактически иметь TokenStreams в качестве графиков), и некоторые другие.Полный список, как обычно, можно найти в исходном коде Lucene .
Обычно после вызова incrementToken()
вы получаете текст токена из предыдущего TokenStream
и выполняете некоторые манипуляциис этим.
Я мог бы представить, что некоторый код, связанный с анализом НЛП, мог бы выглядеть так:
if (!input.incrementToken()) {
return false; // no more tokens left
} else {
final CharTermAttribute attribute = input.getAttribute(CharTermAttribute.class); //getting token text from the previous TokenStream
final String result = doNLP(attribute.toString()); // invoking your NLP analysis on token text
termAtt.copyBuffer(result , 0, suffix.length()); // storing output result of your NLP analysis in the CharTermAttribute that you have in your TokenStream, so later indexing pipeline could use it
}
Конечно, вам нужно инициализировать этот termAtt
в вашем классе примерно так:CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);