Lucene索引:排除某些术语
答
答
StandardAnalyzer
有一个maxTokenLength
属性,你可以设置,我认为它已经消除了数字开始的令牌。但是,如果您有更具体的需求,则需要制作自己的Analyzer
,并可能需要TokenFilter
。与Lucene的文档相反,由于源于标记化过程的最高性能需求的不寻常的编码模式,实现这些类并不是“直接的”。例如,没有办法通过扩展它来稍微修改StandardAnalyzer
的行为,您必须从其中一个基类开始。如果您扩展了StandardAnalyzer,
相同的等级,您将创建一个可重复使用的分析仪,您必须格外小心以符合其合同。
因此,首先尝试从现有过滤器中放置一个分析仪。例如,在Lucene核心中提供了LengthFilter
。如果失败,请实施您自己的过滤器并将其构建到分析仪中。
这可以帮助你在执行这两个过滤器和分析器开始:
public class MyFilter extends FilteringTokenFilter
{
private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
public MyFilter(TokenStream in) { super(false, in); }
protected boolean accept() {
final int len = termAtt.length();
final int d = termAtt.charAt(0) - '0':
return len >= 3 && len <= 20 && (d < 0 || d > 9);
}
}
public final class MyAnalyzer extends ReusableAnalyzerBase
{
@Override protected TokenStreamComponents createComponents(
String fieldName, Reader reader)
{
final Tokenizer source = new LowerCaseTokenizer(Version.LUCENE_35, reader);
return new TokenStreamComponents(source, new MyFilter(source));
}
}