Lucene索引:排除某些术语

问题描述:

如何根据长度排除某些术语?例如,请勿对小于3个字母或超过20个字母的字词进行索引。也排除以数字开头的单词。Lucene索引:排除某些术语

谢谢,

您可以编写自定义令牌过滤器来完成所有这些。更多详情请参阅http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/api/all/org/apache/lucene/analysis/package-summary.html

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)); 
    } 
}