论坛首页 Java企业应用论坛

TokenFilter如何访问整个的Token流而不是一次只能访问一个Token

浏览 3272 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-01-17  
按照lucene的说法,我们可以扩展CharFilter,Tokenizer和Filter。

现在是,我可以模仿org.apache.solr.analysis.PatternReplaceCharFilter创建一个新的CharFilter,来对整个输入内容进行修改:例如,我的一个文本文件的全部内容是,“这是我的全部文本内容”,那么在我的CharFilter中,我能够对整个文本文件内容,即“这是我的全部文本内容”进行任意处理。

但是,对Filter而言,就不是这么回事儿了。在Apache 3.1 Cookbook,第八章的小节Developing Your Own Filter,第218页,有一个Filter的例子。这个例子很明白的显示,在Filter中只能一次获取一个Token,然后对Token进行处理,无法获取整个文本文件分词过后的Token流,如“这 是 我 的 全部 文本 内容”。但有时候我想会有这种需求,那就是访问分词过后的整个Token流,而不是一次只能访问一个,因为有时候你想在Token流中发现pattern并处理。

有谁有什么建议么?谢谢~~~
   发表时间:2013-01-19  
Filter是可以读完super的全部或部分token到自己的buffer中,然后按自己的逻辑控制incrementToken方法。
0 请登录后投票
   发表时间:2013-01-21  
elton_john007 写道
Filter是可以读完super的全部或部分token到自己的buffer中,然后按自己的逻辑控制incrementToken方法。


谢谢指教~~~

我看了看文档,感觉是incrementToken的返回值很有讲究。下面是我的试验代码,可以运行:

    private final StringBuffer buffer = new StringBuffer();
   
    @Override
    public boolean incrementToken() throws IOException {
        if (input.incrementToken()) {
            String term = charTermAttr.toString();
            buffer.append(term).append(" ");
        return true;
        } else {
        System.out.println("the indexed content is: " + buffer);
        buffer.setLength(0);
        }
        return false;
    }

我想就可以在打印语句那里对buffer里的内容进行匹配识别了(当然可以用更好的数据结构来取代buffer)。另外,我感觉只能用input.incrementToken()来获得TokenStream的内容。

这个是不是你的建议?或者还有更好的想法?谢谢~~~
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics