【问题标题】:Lucene TokenFilter: How to recognize the last token from TokenStream?Lucene TokenFilter:如何识别来自 TokenStream 的最后一个令牌?
【发布时间】:2016-06-07 00:43:06
【问题描述】:

对于 Lucene,我只想用 tokenFilter 对 tokenStream 的最后一个 token 做一些处理。例如,给定句子“hello my world”,仅将我的处理应用于“world”,而不是其他标记。

我可以通过首先迭代 tokenStream 的整个输入以获得最后一个令牌的偏移量,然后从第一个令牌重新开始。因为我已经知道了最后一个token的偏移量,所以我可以识别当前token是否是最后一个token。

但是,由于循环两次肯定是低效的,我想只迭代一次 tokenStream 来做到这一点,但似乎很难找到正确的方法。

例如,假设 MyFilter 看起来像:(当然,这个 MyFilter 是 TokenFilter 的基本结构)。

public class MyFilter extends TokenFilter{

    public MyFilter(TokenStream input){
        super(input);
    }

    @Override
    public boolean incrementToken() throws IOException {
        if (input.incrementToken()){

            /*
                if(current token is the last token):
                    Want to apply something only to the last token.
            */

            return true;
        }
        return false;
    }
}

如何识别当前token是不是最后一个?

【问题讨论】:

    标签: lucene token


    【解决方案1】:

    我很可能在这里搞错了,但我认为 的想法正是您可能能够分辨出它在哪里开始,但要知道它在哪里结束要棘手得多......这可能就是他们称之为Token*Stream*的原因。

    TokenFilter 可以告诉您流何时开始:您只需覆盖reset()

    当然,有一个方法 TokenFilter.end(),你可以尝试覆盖它,但 Javadoc 说:

    该方法由消费者在最后一个令牌被调用后调用 消耗,在 TokenStream.incrementToken() 返回 false 之后(使用 新的 TokenStream API)。

    ...这可能意味着它的输出已经被“消费者”使用了。

    要检测到结尾,我认为您必须重新设计您的Tokenizer。例如,仅查看StandardTokenizer 及其“业务端”StandardTokenizerImpl,这可能涉及很多。毫无疑问,制作自己的简单Tokeniser 更好:它接受Strings 或其他任何内容,并且继续进行的方法是在将标记喷出到过滤器之前进行标记化。你会知道有多少代币将被喷出,并且(例如)你可以随时将此号码提供给你的TokenFilter...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多