我试图仅使用字母(即删除所有空白字符和标点符号)索引ngrams,以便用户即使在搜索期间省略单词之间的空格也可以找到文档。为此,我选择了最小10个字符,最多20个字符。我正在使用另一个自定义过滤器过滤标记器,该过滤器删除所有空格字符和标点符号和数字(基本上除了字母a-z
和A-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的索引,同时允许来自同一文档的其他文档?有什么建议吗?