Lucene - Ngram:如何在索引编制期间跳过特定标记

时间:2015-10-08 10:00:30

标签: java lucene text-mining n-gram

我试图仅使用字母(即删除所有空白字符和标点符号)索引ngrams,以便用户即使在搜索期间省略单词之间的空格也可以找到文档。为此,我选择了最小10个字符,最多20个字符。我正在使用另一个自定义过滤器过滤标记器,该过滤器删除所有空格字符和标点符号和数字(基本上除了字母a-zA-Z之外的所有字符)。生成ngram并将其编入索引,但是当我从自定义过滤器中的字符串中删除不需要的字符时,某些ngrams的大小会减少到我选择的最小大小以及那些也被索引。我希望跳过那些特殊的令牌。

这是我的代码:

public class NGramAnalyzer extends Analyzer {

    public NGramAnalyzer() {
        super();
    }

    @
    Override
    protected TokenStreamComponents createComponents(String fieldname) {
        Tokenizer source = new NGramTokenizer(10, 20);
        result = new CustomFilter(tokenizer);
        return new TokenStreamComponents(source, result);
    }



    public class CustomFilter extends TokenFilter {
        private CharTermAttribute termAttr = addAttribute(ChartermAttrribute.class);

        public CustomFilter(TokenStream tokenStream) {
            super(tokenStream);
        }

        @
        Override
        public boolean incrementToken() throws IOException {
            if (input.incrementToken()) {
                String s = String.valueOf(termAttr).replaceAll("[^a-zA-Z]", ""); //removing all characters except english letters
                this.termAttr.setEmpty().append(s);
                return true;
            }
            return false;
        }

    }
}

我尝试将LengthFilter(result,10,20)与通过customfilter获取的令牌流一起使用,但是如果在删除不需要的字符后,该文档中任何一个ngrams的长度都低于10,则使用lengthfilter会跳过整个文档。 / p>

在自定义过滤器中更改了ngrams的长度之后,如何跳过低于特定大小的文档的ngram的索引,同时允许来自同一文档的其他文档?有什么建议吗?

0 个答案:

没有答案